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()); */ } }
上面例子很好的展示的Quartz的三个要素
- Scheduler:调度器。所有的调度都是由它控制。
- Trigger: 定义触发的条件。例子中,它的类型是SimpleTrigger,每隔1秒中执行一次(什么是SimpleTrigger下面会有详述)。
- JobDetail & Job: JobDetail 定义的是任务数据,而真正的执行逻辑是在Job中,例子中是HelloQuartz。 为什么设计成JobDetail + Job,不直接使用Job?这是因为任务是有可能并发执行,如果Scheduler直接使用Job,就会存在对同一个Job实例并发访问的问题。而JobDetail & Job 方式,sheduler每次执行,都会根据JobDetail创建一个新的Job实例,这样就可以规避并发访问的问题。