0

我在 spring 3.1.0 中使用旧版本的石英(2.1.2)。我有简单的配置,应该防止并行作业执行:

<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

这是不寻常的情况。有时工作在两台机器上开始,有时只在一台机器上开始。我检查了我的应用程序日志,在数据处理过程中没有发现任何错误。有时工作开始之间的差距很小 - 毫秒,有时是几秒钟。我应该在哪里寻找错误?我在配置中遗漏了什么吗?

4

1 回答 1

2

这可能与时钟漂移有关。您需要确保每个节点之间的时钟同步。

来源: http ://www.quartz-scheduler.org/documentation/quartz-2.x/configuration/ConfigJDBCJobStoreClustering.html 和 https://stackoverflow.com/a/12629332/7321097

于 2017-10-04T12:53:49.913 回答