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