我正在示例Spring Boot 1.5应用程序中尝试集群Quartz。
但是我对以下行为感到非常恼火:当一个节点发生故障时,第二个节点接管运行任务的任务,但运行所有错过的执行。
这是完整的场景(我必须到节点,严格相同):
我的猜测是,节点#2首次执行任务(当我在一秒钟内获得4或5次运行时)是“缺失”执行的运行(通常在两次间隔之间运行的那些) #1节点停止,而#2节点接管任务的时间。
我想跳过那些第一次运行,只是让节点#2每秒钟运行一次任务。
但是很明显,Quartz认为这些首次执行不是“失火”:我尝试了所有可能的“失火指令”,但是没有一个可以跳过那些运行。
以下是创建触发器的方式:
public SimpleTriggerFactoryBean createTrigger(JobDetail jobDetail) {
SimpleTriggerFactoryBean factoryBean = new SimpleTriggerFactoryBean();
factoryBean.setJobDetail(jobDetail);
factoryBean.setStartDelay(0L);
factoryBean.setRepeatInterval(1000);
factoryBean.setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY);
// in case of misfire, ignore all missed triggers and continue :
factoryBean.setMisfireInstruction(SimpleTrigger.MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_REMAINING_COUNT);
return factoryBean;
}
这是Quartz配置:
org.quartz.scheduler.instanceName=quartz-clustered
org.quartz.scheduler.instanceId=AUTO
org.quartz.threadPool.threadCount=5
org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
org.quartz.jobStore.misfireThreshold=60000
org.quartz.jobStore.tablePrefix=QRTZ_
org.quartz.jobStore.isClustered=true
org.quartz.jobStore.clusterCheckinInterval=5000
# A different classloader is needed to work with Spring Boot dev mode,
# see https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-devtools.html#using-boot-devtools-known-restart-limitations
# and https://github.com/quartz-scheduler/quartz/issues/221
org.quartz.scheduler.classLoadHelper.class=org.quartz.simpl.ThreadContextClassLoadHelper
org.quartz.scheduler.skipUpdateCheck=true