我在负载平衡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
答案 0 :(得分:1)
根据文档,您需要设置org.quartz.jobStore.clusterCheckinInterval
。
答案 1 :(得分:1)
我知道回答你的问题为时已晚。但最近我遇到了同样的问题并在网上发现了你的帖子。
每当有两个实例运行时,其中一个实例都会尝试锁定作业。由于你的触发时间是每隔 10秒非常少(0/10 * * * *?),因此实例2无法锁定作业。
将时间段增加到一分钟(* 0/1 * * *?)。您可以看到,实例都将处理该作业。
如果您遇到任何其他问题,请与我们联系。
答案 2 :(得分:1)
对集群的每个节点自动进行负载平衡 尽可能快地解雇工作。 [...]只有一个节点会启动 每次射击的工作。 [...]它们不一定是每个节点 时间 - 它或多或少是随机的,哪个节点运行它。负载 对于繁忙的调度程序来说,平衡机制几乎是随机的(很多 触发器)但有利于非繁忙的同一节点(例如几个触发器) 调度器。