这里有一个spring应用程序-- Yevi。Yevi部署在具有6个节点的集群环境中。使用共享的Yevi部署包的所有节点。应用程序在applicationContext.xml中具有以下配置:
<bean id="cronYeviTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="YeviJob"/>
<!-- run every morning at 6 AM -->
<property name="cronExpression" value="0 0 6 * * ?"/>
</bean>
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="YeviTrigger"/>
</list>
</property>
<property name="configLocation" value="classpath:quartz.properties"/>
</bean>而且,quartz.properties现在什么都没有。上面的CRON作业设计为每天早上6点运行,并执行一些业务操作,并在业务操作完成后返回。并且,在同一时间再次醒来,并执行相同的业务操作。
我相信,这个问题与集群环境有关。一旦所有节点都启动并运行。创建了6个CRON Jobs --每个节点上都有一个,愿望业务操作执行6次,而不是一天只执行一次。
我认为,必须有某种配置才能只在单个节点上运行一次,而不是运行所有节点。我需要它在早上6点运行这个CRON作业,只有一个节点,如果该节点完成了,那么在失败时,它应该检查下一个节点并在那里运行CRON作业。
谢谢!
发布于 2014-03-21 11:57:42
使用JDBC JobStore,您可以精确地通过一个节点实现触发器触发。
http://quartz-scheduler.org/documentation/quartz-2.2.x/configuration/ConfigJDBCJobStoreClustering
编辑
集群目前只适用于Jobstore (JobStoreTX或JobStoreCMT),本质上是通过集群的每个节点共享相同的数据库来工作。 负载平衡会自动发生,集群的每个节点都会尽可能快地触发作业。当一个触发器的触发时间发生时,获取它的第一个节点(通过在它上放置一个锁)是将触发它的节点。 每次发射时,只有一个节点会触发作业。我的意思是,如果作业有一个重复的触发器,告诉它每10秒触发一次,那么在12:00,正好有一个节点将运行作业,而在12:00:10,正好有一个节点将运行作业,等等。它不一定是同一节点,而是随机运行它的节点。对于繁忙的调度器(很多触发器),负载平衡机制几乎是随机的,但对于非繁忙(例如,很少触发器)调度器,则倾向于相同的节点。
发布于 2022-11-16 15:34:07
我不得不管理我花了很长时间和Quartz一起处理这个问题,然后才意识到创建一个新的线程
while (true) {
doThing();
sleep(TIME_GAP)
}是在每个节点上运行作业的简单得多的解决方案。
记住让线程成为一个deamon线程,这样它就不会阻止JVM的关闭
https://stackoverflow.com/questions/20990490
复制相似问题