У меня есть два узла, выполняющих некоторую работу по выражению cron. Первый узел всегда получает org.quartz.JobExecutionException. Я ожидаю, что другой узел восстановит его, но он застрял в первом узле в бесконечном сбое Оба планировщика настроили одну и ту же конфигурацию:
<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="sendSmsTrigger"/>
</list>
</property>
<property name="dataSource" ref="cpXADataSource" />
<property name="nonTransactionalDataSource" ref="cpNonXADataSource" />
<property name="applicationContextSchedulerContextKey" value="springApplicationContext" />
<property name="globalJobListeners">
<list>
<bean class="some.package.util.TransactionalJobListener">
<constructor-arg ref="platformTransactionManager"/>
</bean>
</list>
</property>
<property name="quartzProperties">
<props>
<prop key="org.quartz.scheduler.instanceName">${quartz.instance.name}</prop>
<prop key="org.quartz.jobStore.isClustered">${quartz.is.clustered:true}</prop>
<prop key="org.quartz.threadPool.threadCount">${quartz.thread.pool.count:1}</prop>
<prop key="org.quartz.scheduler.instanceId">AUTO</prop>
<prop key="org.quartz.scheduler.skipUpdateCheck">${quartz.update.skip:true}</prop>
<prop key="org.quartz.jobStore.tablePrefix">${quartz.tables.prefix}</prop>
<prop key="org.quartz.jobStore.driverDelegateClass">org.quartz.impl.jdbcjobstore.PostgreSQLDelegate</prop>
<prop key="org.quartz.jobStore.class">${quartz.jobstore.class:org.quartz.impl.jdbcjobstore.JobStoreTX}</prop>
</props>
</property>
</bean>
Детали задания:
Class<? extends Job> jobClass = (this.concurrent ? SpringMethodInvokingJob.class : StatefulSpringMethodInvokingJob.class);
JobBuilder builder = JobBuilder.newJob(jobClass)
.withIdentity(name, group);
builder = builder.storeDurably();
builder = builder.requestRecovery();
builder.usingJobData(BEAN_NAME_KEY.getValue(), targetBeanName);
builder.usingJobData(METHOD_KEY.getValue(), targetMethod);
return builder.build();
Оба планировщика явно смотрят на одни и те же таблицы
Не могу сказать, что эта проблема будет воспроизводиться всегда на 100%, потому что второй узел всегда блокирует таблицу первым и задание заканчивая правильно, поэтому мне нужно:
1) завершить работу второго узла
2) первый узел получает задание и начинает сбой
3) включает второй узел и ожидает восстановления задания
Но задание зависает в первом узле, пока второй узел внезапно не получит блокировку таблицы, после чего задание будет успешно выполнено.