Кварц с пружиной - кластерная среда

Я использую старую версию кварца (2.1.2) с пружиной 3.1.0. У меня простая конфигурация, которая должна предотвратить параллельное выполнение заданий:

<bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="jobFactory">
        <bean class="com.azdne.infrastructure.schedule.ScheduledMethodJobFactory" />
    </property>
    <property name="dataSource" ref="schedulerDataSource" />
    <property name="quartzProperties">
        <props>
            <prop key="org.quartz.scheduler.instanceName">scheduler-cluster</prop>
            <prop key="org.quartz.jobStore.driverDelegateClass">org.quartz.impl.jdbcjobstore.StdJDBCDelegate</prop>
            <prop key="org.quartz.jobStore.isClustered">true</prop>
            <prop key="org.quartz.threadPool.threadCount">4</prop>
            <prop key="org.quartz.scheduler.instanceId">AUTO</prop>
            <prop key="org.quartz.scheduler.skipUpdateCheck">true</prop>
        </props>
    </property>
</bean>

'threadCount' установлен в 4, потому что у меня есть больше заданий для выполнения в запланированное время. Я также аннотировал свой класс работы с помощью @DisallowConcurrentExecution:

@Component 
@DisallowConcurrentExecution
public class MyJob{
   @Transactional(timeout=900)
   @Scheduled(cron = "0 0 2 * * ?")
   public void execute() {
   ... implementation goes here
   }
}

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

NODE 1: task-executor.log.2017-05-16.gz:16/05/2017 02:00:00.068 [org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-3] INFO  com.package.schedule.job.MyJob.execute - MyJob job - start

NODE 2: task-executor.log.2017-05-16.gz:16/05/2017 02:00:00.103 [org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-1] INFO  com.package.schedule.job.MyJob.execute - MyJob job - start

Это необычная ситуация. Иногда работа запускается на обеих машинах, иногда только на одной. Я проверил журналы своего приложения и не обнаружил ошибок при обработке данных. Иногда промежуток между запусками задания небольшой - миллисекунды, иногда секунды. Где искать ошибку? Мне что-то не хватает в конфигурации?


person problemgenerator    schedule 11.07.2017    source источник


Ответы (1)


Возможно, дело в дрейфе часов. Вам необходимо убедиться, что часы синхронизированы между всеми узлами.

источник: http://www.quartz-scheduler.org/documentation/quartz-2.x/configuration/ConfigJDBCJobStoreClustering.html и https://stackoverflow.com/a/12629332/7321097

person Chaouki Dhib    schedule 04.10.2017