集群中的Quartz故障转移

时间:2018-11-22 09:53:45

标签: spring-boot cluster-computing quartz-scheduler

我正在示例Spring Boot 1.5应用程序中尝试集群Quartz。

但是我对以下行为感到非常恼火:当一个节点发生故障时,第二个节点接管运行任务的任务,但运行所有错过的执行。

这是完整的场景(我必须到节点,严格相同):

  1. 启动节点#1。节点#1每秒钟开始执行任务(这是基本日志)
  2. 启动节点#2。节点2尚未执行任何操作。
  3. 停止节点#1。几秒钟后,节点#2什么也不做。
  4. 当节点#2决定开始执行任务时,它开始于一秒钟内运行4或5次任务执行。
  5. 之后,任务会像往常一样在节点#2上每秒执行一次。

我的猜测是,节点#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

0 个答案:

没有答案