Я пытаюсь использовать кластеризованный Quartz в примере приложения Spring Boot 1.5.
Но меня очень раздражает следующее поведение: при сбое одного узла второй узел берет на себя ответственность за выполнение задачино запускает все пропущенные исполнения.
Вот полный сценарий (у меня есть узлы, строго идентичные):
- Начальный узел # 1.Узел № 1 начинает выполнять задачу (которая является базовым журналом) каждую секунду
- Начать узел № 2.Узел № 2 пока ничего не делает.
- Остановка узла № 1.В течение нескольких секунд узел № 2 ничего не делает.
- Когда узел № 2 решает начать выполнение задачи, он начинается с 4 или 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