Кварцевое аварийное переключение в кластере - PullRequest
0 голосов
/ 22 ноября 2018

Я пытаюсь использовать кластеризованный Quartz в примере приложения Spring Boot 1.5.

Но меня очень раздражает следующее поведение: при сбое одного узла второй узел берет на себя ответственность за выполнение задачино запускает все пропущенные исполнения.

Вот полный сценарий (у меня есть узлы, строго идентичные):

  1. Начальный узел # 1.Узел № 1 начинает выполнять задачу (которая является базовым журналом) каждую секунду
  2. Начать узел № 2.Узел № 2 пока ничего не делает.
  3. Остановка узла № 1.В течение нескольких секунд узел № 2 ничего не делает.
  4. Когда узел № 2 решает начать выполнение задачи, он начинается с 4 или 5 выполнений задачи в одну секунду.
  5. После этого задача выполняется, как обычно, каждую секунду на узле №2.

Я предполагаю, что при первом выполнении задачи узлом №2 (когда я получаю 4 или 5, запускается толькоодна секунда) - это запуск «пропущенных» выполнений (те, которые обычно выполнялись бы между остановленным временным узлом № 1 и временным узлом № 2, принявшим задачу).

Я хотел бы пропуститьэти первые запускаются, и только узел № 2 запускает задачу каждую секунду.

Но, очевидно, эти первые исполнения не рассматриваются Кварцем как "пропуски зажигания": я перепробовал все возможные "инструкции по пропускам зажигания", но ни одинони могут пропустить эти запуски.

Вот как создается триггер:

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
...