Quartz集群无法恢复失败的作业

时间:2020-01-16 13:43:33

标签: java spring quartz

我有两个节点通过cron表达式执行某些作业。第一个节点始终获取org.quartz.JobExecutionException。我希望另一个节点可以恢复它,但是它卡在了 无休止的enter image description here中的第一个节点 两个调度程序都配置了相同的配置:

<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();

两个调度程序显然都在看相同的表 enter image description here

我不能说这个问题总是会重现100%,因为第二个节点总是总是先锁定表并正确完成工作,所以我需要:

1)关闭第二个节点

2)第一个节点获得作业并开始失败

3)启用第二个节点并等待恢复作业

但是作业挂在第一个节点上,直到第二个节点突然获得对表的锁定,然后作业才能成功执行。

0 个答案:

没有答案