1.先描述一下问题
在开发过程中意外发现,在启动spring boot项目时quartz cronTirgger自动执行,也就是说定时任务被自动触发。
2.问题解决
查阅资料之后发现,和quartz misfire(失火)策略有关,我们看下源码:
可以看到默认的失火策略为0,目前还不知道为0的具体含义,我们在看下面具体的方法:
这里定义了三种misfire策略(仅限于CronTrigger),查阅资料:
1.withMisfireHandlingInstructionIgnoreMisfires
所有未触发的执行都会立即执行,然后触发器按计划运行。
示例场景:安排在上午 9 点和 10 点的执行会立即执行。下一次计划执行(上午 11 点)准时运行。
2.withMisfireHandlingInstructionDoNothing
所有未触发的执行都将被丢弃,调度程序只是等待下一个调度时间。
示例场景:安排在上午 9 点和 10 点的执行被丢弃,因此基本上什么也没有发生。下一次计划执行(上午 11 点)准时运行。
3.withMisfireHandlingInstructionFireAndProceed
立即执行第一个错误的执行并丢弃其他(即所有错误的执行合并在一起)。然后回到日程。无论错过了多少次触发器执行,都只会立即执行一次。
示例场景:安排在上午 9 点和上午 10 点的执行合并并仅执行一次(换句话说:安排在上午 10 点的执行被丢弃)。下一次计划执行(上午 11 点)准时运行。
quartz持久化,具体的misfire策略存在qrtz_triggers表中的MISFIRE_INSTR字段中
另外SimpleTrigger还有很多misfire策略,本案例不做解释,可以查阅资料:https://dzone.com/articles/quartz-scheduler-misfire