quartz任务框架有两个重要对象,作业JobDetail和触发器Trigger,它们是多对多的关系
作业
JobDetail
JobDetail jobDetail = JobBuilder.newJob(HelloQuartzJob.class) .withIdentity("testJob_1", "group_1") .build();
触发器
Trigger,Quartz有两大触发器,SimpleTrigger和CronTrigger
Trigger trigger = TriggerBuilder.newTrigger()//创建一个新的TriggerBuilder来规范一个触发器 .withIdentity("trigger_1", "group_1")//给触发器一个名字和组名 // .startNow()//立即执行 .startAt(runTime)//设置触发开始的时间 .withSchedule ( SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(10)//时间间隔 .withRepeatCount(5)//重复次数(将执行6次) ) .build();//产生触发器
//
String cronExpression = "30/5 * * * * ?"; // 每分钟的30s起,每5s触发任务
CronTrigger cronTrigger = new CronTriggerImpl("cronTrigger",
Scheduler.DEFAULT_GROUP, cronExpression);
cron有6个必要组件和1个可选组件:年(可选)-星期-月-日-时-分-秒。
misfire特性
在 Quartz 应用中,misfired job 是经常遇到的情况。一般来说,下面这些原因可能造成 misfired job:
1)系统因为某些原因被重启。在系统关闭到重新启动之间的一段时间里,可能有些任务会被 misfire;
2)Trigger 被暂停(suspend)的一段时间里,有些任务可能会被 misfire;
3)线程池中所有线程都被占用,导致任务无法被触发执行,造成 misfire;
4)有状态任务在下次触发时间到达时,上次执行还没有结束;
为了处理 misfired job,Quartz 中为 trigger 定义了处理策略,主要有下面两种:
MISFIRE_INSTRUCTION_FIRE_ONCE_NOW:针对 misfired job 马上执行一次;
MISFIRE_INSTRUCTION_DO_NOTHING:忽略 misfired job,等待下次触发;
建议读者在应用开发中,将该设置作为可配置选项,使得用户可以在使用过程中,针对已经添加的 tirgger 动态配置该选项。