集群Quartz调度程序无法正确触发?

时间:2012-03-13 14:13:10

标签: java spring quartz-scheduler

我在群集配置中使用Spring 2.5和Quartz Scheduler 1.8.6。此作业同步两个数据库。我有以下配置:

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean" id="quartzScheduler" lazy-init="false">
    <property name="applicationContextSchedulerContextKey" value="applicationContext"/>
    <property name="dataSource" ref="dataSource"/>
    <property name="transactionManager" ref="transactionManager"/>
    <property name="overwriteExistingJobs" value="true"/>
    <property name="autoStartup" value="true"/>
    <property name="triggers">
        <list>
            <bean class="org.springframework.scheduling.quartz.CronTriggerBean" id="someCronTrigger">
                <property name="jobDetail" ref="myQuartzJobDetail"/>
                <property name="cronExpression" value="${cronExpression}"/>
            </bean>
        </list>
    </property>
    <property name="quartzProperties">
        <props>
            <prop key="org.quartz.scheduler.instanceName">MyBatchScheduler</prop>
            <prop key="org.quartz.scheduler.instanceId">AUTO</prop>
            <prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop>
            <prop key="org.quartz.threadPool.threadCount">1</prop>
            <!-- Don't set thread priority for now -->
            <prop key="org.quartz.jobStore.misfireThreshold">30000</prop>
            <prop key="org.quartz.jobStore.class">org.quartz.impl.jdbcjobstore.JobStoreTX</prop>
            <prop key="org.quartz.jobStore.driverDelegateClass">org.quartz.impl.jdbcjobstore.oracle.OracleDelegate</prop>
            <prop key="org.quartz.jobStore.useProperties">false</prop>
            <prop key="org.quartz.jobStore.tablePrefix">QRTZ_</prop>
            <prop key="org.quartz.jobStore.isClustered">true</prop>
            <prop key="org.quartz.jobStore.clusterCheckinInterval">5000</prop>
        </props>
    </property>
</bean>

cronExpression的属性设置为:

cronExpression=0 * * * * ?

即。我想让它每分钟运行一次。我有两台运行此作业的机器完全相同的配置。我看到了这个结果:

Machine 1                                                   Machine 2
2012-03-13 09:47:00,009 INFO  Starting synchronization...   2012-03-13 09:46:00,041 INFO  Starting synchronization...
2012-03-13 09:54:00,010 INFO  Starting synchronization...   2012-03-13 09:51:00,041 INFO  Starting synchronization...
2012-03-13 10:00:00,010 INFO  Starting synchronization...   2012-03-13 09:57:00,042 INFO  Starting synchronization...
2012-03-13 10:02:00,007 INFO  Starting synchronization...   2012-03-13 09:59:00,042 INFO  Starting synchronization...

我不知道为什么这两个应用程序不会按照应有的方式每分钟启动一次。例如,从上面的两个日志开始,工作不会在9:48,9:49,9:50,9:52,9:53等处发生。等任何想法?

修改

正如我在下面的评论中所说的那样,我的问题是有一个流浪的过程,我不是在寻找每分钟消耗一些触发器的过程。我杀了那个流浪的过程然后它按原样运作。

1 个答案:

答案 0 :(得分:0)

您无法控制哪个服务器运行该作业,但您可以保证它将在一台或另一台计算机上运行一次。请注意,如果Quartz集群中的每台计算机上的系统时间没有精确同步,则负载平衡将无法可靠地运行。最有可能的是,未来时间最多的服务器将运行最多(如果不是所有工作)。

  

为什么这两个应用程序不是每分钟都运行一次

我不明白这个问题。你的意思是说某些工作根本没有运行(你的日志表明,它错过了例如09:48:00)?