quzrtz的使用

Quartz是一个大名鼎鼎的Java版开源定时调度器,功能强悍,使用方便。

一、核心概念

1.Job

表示一个工作,要执行的具体内容,此接口只有一个方法

void execute(JobExecutionContext context)

2.JobDetail

JobDetail表示一个具体的可以执行的调度程序,Job是这个可以执行程序所要执行的内容内容,JobDetail包含这个任务调度的方案和策略。

3.Trigger代表一个调度参数的配置,什么时候去调。

4.Schedule代表一个调度容器,一个调度容器中可以注册多个JobDetail和Trigger,当JobDetail和Trigger组合就可以被容器调度。

二:例子:

 1    public static void main(String[] args) {
 2         try {
 3             //创建scheduler
 4             Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
 5 
 6             //定义一个Trigger
 7             Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1") //定义name/group
 8                     .startNow()//一旦加入scheduler,立即生效
 9                     .withSchedule(simpleSchedule() //使用SimpleTrigger
10                             .withIntervalInSeconds(1) //每隔一秒执行一次
11                             .repeatForever()) //一直执行,奔腾到老不停歇
12                     .build();
13 
14             //定义一个JobDetail
15             // 创建一个JobDetail实例,此版本JobDetail已经作为接口(interface)存在,通过JobBuilder创建
16             // 并指定Job在Scheduler中所属组及名称
17           //  JobDetail jobDetail = JobBuilder.newJob(MyJob.class).withIdentity("job1","group1").build();
18             JobDetail job = JobBuilder.newJob(MyJob.class) //定义Job类为HelloQuartz类,这是真正的执行逻辑所在
19                     .withIdentity("job1", "group1") //定义name/group
20                     .usingJobData("name", "quartz") //定义属性
21                     .build();
22 
23             //加入这个调度
24             scheduler.scheduleJob(job, trigger);
25 
26             //启动之
27             scheduler.start();
28 
29             //运行一段时间后关闭
30             Thread.sleep(10000);
31             scheduler.shutdown(true);
32         } catch (Exception e) {
33             e.printStackTrace();
34         }
35     }
简单例子
package quartz;

import org.quartz.*;

import java.util.Date;

/**
 * @author
 * @create 2017-12-12 10:49
 **/
public class MyJob implements Job{

    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        // JobExecutionContext类提供了调度上线问的各种信息,为JobDetail和Trigger提供必要的信息
        // JobKey是由name和group组成,并且name必须在group内是唯一的。如果只指定一组则将使用默认的组名。
        JobDetail detail = jobExecutionContext.getJobDetail();
        String name = detail.getJobDataMap().getString("name");
        System.out.println("hello " + name + "--- " + new Date());

        /**
         * JobDetail detail = context.getJobDetail();
         String name = detail.getJobDataMap().getString("name");
         System.out.println("say hello to " + name + " at " + new Date());
         */
    }
}
View Code

 上面例子很好的展示的Quartz的三个要素

  • Scheduler:调度器。所有的调度都是由它控制。
  • Trigger: 定义触发的条件。例子中,它的类型是SimpleTrigger,每隔1秒中执行一次(什么是SimpleTrigger下面会有详述)。
  • JobDetail & Job: JobDetail 定义的是任务数据,而真正的执行逻辑是在Job中,例子中是HelloQuartz。 为什么设计成JobDetail + Job,不直接使用Job?这是因为任务是有可能并发执行,如果Scheduler直接使用Job,就会存在对同一个Job实例并发访问的问题。而JobDetail & Job 方式,sheduler每次执行,都会根据JobDetail创建一个新的Job实例,这样就可以规避并发访问的问题。
原文地址:https://www.cnblogs.com/java-gaolei/p/8027883.html