Quartz集群 - 负载平衡不起作用

时间:2014-08-07 14:09:16

标签: spring quartz-scheduler

我在负载平衡Quartz作业时遇到问题。当有两个实例在运行时,其中只有一个处理所有作业。第二个是空转。当我终止第一个实例时,第二个实例开始处理作业,直到再次启动第一个实例。

我希望有一种负载均衡可以在这两个实例之间调度作业。

我使用的是Quartz 1.8.6版。

这是applicationContext.xml的一部分:

<bean id="firstJobDetail"
    class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
    <property name="jobClass" value="com.mycompany.quartz.job.FirstJob" />
    <property name="durability" value="true" />
</bean>

<bean id="firstTrigger" class="com.mycompany.quartz.PersistableCronTriggerFactoryBean">
    <property name="jobDetail" ref="firstJobDetail" />

    <property name="cronExpression" value="0/10 * * * * ?" />
</bean>

<bean id="quartzScheduler"
    class="org.springframework.scheduling.quartz.SchedulerFactoryBean">

    <property name="configLocation" value="classpath:META-INF/quartz.properties" />
    <property name="dataSource" ref="dataSource" />
    <property name="transactionManager" ref="transactionManager" />

    <!-- This name is persisted as SCHED_NAME in db. for local testing could 
        change to unique name to avoid collision with dev server -->
    <property name="schedulerName" value="quartzScheduler" />

    <!-- Will update database cron triggers to what is in this jobs file on 
        each deploy. Replaces all previous trigger and job data that was in the database. 
        YMMV -->
    <property name="overwriteExistingJobs" value="true" />

    <property name="autoStartup" value="true" />
    <property name="applicationContextSchedulerContextKey" value="applicationContext" />
    <property name="jobFactory">
        <bean class="com.mycompany.quartz.AutowiringSpringBeanJobFactory" />
    </property>

    <!-- NOTE: Must add both the jobDetail and trigger to the scheduler! -->
    <property name="jobDetails">
        <list>
            <ref bean="firstJobDetail" />
        </list>
    </property>
    <property name="triggers">
        <list>
            <ref bean="firstTrigger" />
        </list>
    </property>
</bean>

这是quartz.properties文件:

# Spring uses LocalDataSourceJobStore extension of JobStoreCMT
org.quartz.jobStore.useProperties=true
org.quartz.jobStore.tablePrefix = QRTZ_
org.quartz.jobStore.isClustered = true

# Change this to match your DB vendor
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate

# Needed to manage cluster instances
org.quartz.scheduler.instanceId=AUTO
org.quartz.scheduler.instanceName=MY_JOB_SCHEDULER

org.quartz.scheduler.rmi.export = false
org.quartz.scheduler.rmi.proxy = false
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 10
org.quartz.threadPool.threadPriority = 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true

3 个答案:

答案 0 :(得分:1)

根据文档,您需要设置org.quartz.jobStore.clusterCheckinInterval

答案 1 :(得分:1)

我知道回答你的问题为时已晚。但最近我遇到了同样的问题并在网上发现了你的帖子。

每当有两个实例运行时,其中一个实例都会尝试锁定作业。由于你的触发时间是每隔 10秒非常少(0/10 * * * *?),因此实例2无法锁定作业。

将时间段增加到一分钟(* 0/1 * * *?)。您可以看到,实例都将处理该作业。

如果您遇到任何其他问题,请与我们联系。

答案 2 :(得分:1)

Documentation说:

  

对集群的每个节点自动进行负载平衡   尽可能快地解雇工作。 [...]只有一个节点会启动   每次射击的工作。 [...]它们不一定是每个节点   时间 - 它或多或少是随机的,哪个节点运行它。负载   对于繁忙的调度程序来说,平衡机制几乎是随机的(很多   触发器)但有利于非繁忙的同一节点(例如几个触发器)   调度器。