我有两个节点通过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)启用第二个节点并等待恢复作业
但是作业挂在第一个节点上,直到第二个节点突然获得对表的锁定,然后作业才能成功执行。