上一篇写了一个简单的demo演示了Quartz用到了哪些接口和类,这一边就来具体讲讲这些接口和类的含义。
这一篇可以结合下一篇Quartz在项目中的使用结合起来看,这样能更加理解些
对了,这篇文章最实用重要的内容在最下面Cron,不想看理论的可以直接看到最下面
Quartz的核心:Job,Trigger,Scheduler
- Job 为作业的接口,为任务调度的对象;
- JobDetail 作业实例用来描述 Job 的实现类及其他相关的静态信息;
- Trigger触发器做为作业的定时管理工具,一个 Trigger 只能对应一个作业实例,而一个作业实例可对应多个触发器;
- Scheduler 做为定时任务容器,是 Quartz 最上层的东西,它提携了所有触发器和作业,使它们协调工作,每个 Scheduler 都存有 JobDetail 和 Trigger 的注册,一个 Scheduler 中可以注册多个 JobDetail 和多个 Trigger。
- Trigger和Job的name、group:
- name是用来标记的
- group是用来分组方便管理的
验证一个作业实例被多个触发器调用:
先说下:group组的作用,即定义的SimpleJob
是为了方便操作,可以同时对一组任务进行操作。
如停止一组任务或者触发器:
修改job2方便打印是哪个触发器触发:
public class SimpleJob2 extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("2 extends QuartzJobBean" + sdf.format(new Date()));
//打印是哪个触发器触发
System.out.println("======trigger by:" + jobExecutionContext.getTrigger());
}
}
修改任务调度器内容,添加一个触发器:
public class TestSimpleJob1 {
public static void main(String args[]) {
try {
// 获取一个调度程序的实例
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
// 定义一个job,并绑定SimpleJob1、2
// 这里不回马上创建一个SimpleJob实例,实例创建时在scheduler安排任务出发执行时创建的
// 设置job的名称及分组
JobDetail jobDetail1 = JobBuilder.newJob(SimpleJob1.class).withIdentity("SimpleJob1", "SimpleJob").build();
JobDetail jobDetail2 = JobBuilder.newJob(SimpleJob2.class).withIdentity("SimpleJob2", "SimpleJob").build();
// 声明触发器
Trigger trigger1 = TriggerBuilder.newTrigger().withIdentity("SimpleTrigger1", "SimpleJob").startNow()
.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5).repeatForever()).build();
Trigger trigger2 = TriggerBuilder.newTrigger().withIdentity("SimpleTrigger2", "SimpleJob").startNow()
.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5).repeatForever()).build();
Trigger trigger3 = TriggerBuilder.newTrigger().withIdentity("SimpleTrigger3", "SimpleJob")
.forJob("SimpleJob2", "SimpleJob").startNow()
.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(6).repeatForever()).build();
scheduler.scheduleJob(jobDetail1, trigger1);
scheduler.scheduleJob(jobDetail2, trigger2);
scheduler.scheduleJob(trigger3);
scheduler.start();
Thread.sleep(30000);
scheduler.shutdown();
} catch (SchedulerException | InterruptedException e) {
e.printStackTrace();
}
}
}
结果:可以看到2个触发器对同一个job执行了
10:56:32.026 [DefaultQuartzScheduler_QuartzSchedulerThread] DEBUG org.quartz.simpl.PropertySettingJobFactory - Producing instance of Job 'SimpleJob.SimpleJob1', class=com.yhx.toali.Quartz.QuartzFrame.SimpleDemo.SimpleJob1
10:56:32.031 [DefaultQuartzScheduler_QuartzSchedulerThread] DEBUG org.quartz.core.QuartzSchedulerThread - batch acquisition of 1 triggers
10:56:32.031 [DefaultQuartzScheduler_QuartzSchedulerThread] DEBUG org.quartz.simpl.PropertySettingJobFactory - Producing instance of Job 'SimpleJob.SimpleJob2', class=com.yhx.toali.Quartz.QuartzFrame.SimpleDemo.SimpleJob2
10:56:32.044 [DefaultQuartzScheduler_Worker-1] DEBUG org.quartz.core.JobRunShell - Calling execute on job SimpleJob.SimpleJob1
1 implements Job2022-01-17 10:56:32
10:56:32.049 [DefaultQuartzScheduler_QuartzSchedulerThread] DEBUG org.quartz.core.QuartzSchedulerThread - batch acquisition of 1 triggers
10:56:32.049 [DefaultQuartzScheduler_QuartzSchedulerThread] DEBUG org.quartz.simpl.PropertySettingJobFactory - Producing instance of Job 'SimpleJob.SimpleJob2', class=