最近由于对Quartz调度任务要求比较高,总结了一下:
1.任务继承StatefulJob 和 Job接口,前者有状态,不会并发执行;后者无状态,支持并发;
2.其次对于Trigger Scheduler,Simple支持简单的类似java的TimerTask式的调度,Cron支持cron表达式 的复杂的周期调度;
3.对于quartz.properties文件,默认是先从classpath:quartz.properties寻找,之后从jar包org/quartz/quartz.properties;
4.对于Cron表达式调度,有misfire策略,设置如下:
CronTrigger trigger = TriggerBuilder
.newTrigger()
.withIdentity(triggerKey)
.withSchedule(
CronScheduleBuilder.cronSchedule(task.getCronExp())
.withMisfireHandlingInstructionDoNothing()).build();
:如果一个任务每5分钟执行一次,当前00:05触发,任务执行需要6分钟,此时发生misfire事件(
):当需要忽略错过的未执行的(00:10)设置策略是do_nothing,此时会以当前时间为基准设置下次启动是00:15.
此时还会有个坑:quartz.properties配置项org.quartz.jobStore.misfireThreshold = 60000 默认是1分钟。意思是如果任务执行了5分钟49秒,那么由于此时是00:10:49 ,与00:10有差值是49s小于 默认值一分钟,则处于00:10的任务会立即调起,这就是org.quartz.jobStore.misfireThreshold = 60000的作用!
5.附链接:http://www.tuicool.com/articles/ymMZNb