Кварцевый кластер не восстанавливается - PullRequest
0 голосов
/ 16 января 2020

У меня есть два узла, выполняющих некоторую работу по выражению 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) включает второй узел и ожидает восстановления задания

Но задание зависает в первом узле, пока второй узел внезапно не получит блокировку таблицы, после чего задание будет успешно выполнено.

...