首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring服务只需要在单个节点上运行,而不是在所有节点上运行。

Spring服务只需要在单个节点上运行,而不是在所有节点上运行。
EN

Stack Overflow用户
提问于 2014-01-08 08:33:44
回答 2查看 2K关注 0票数 0

这里有一个spring应用程序-- Yevi。Yevi部署在具有6个节点的集群环境中。使用共享的Yevi部署包的所有节点。应用程序在applicationContext.xml中具有以下配置:

代码语言:javascript
复制
<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作业。

谢谢!

EN

回答 2

Stack Overflow用户

发布于 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,正好有一个节点将运行作业,等等。它不一定是同一节点,而是随机运行它的节点。对于繁忙的调度器(很多触发器),负载平衡机制几乎是随机的,但对于非繁忙(例如,很少触发器)调度器,则倾向于相同的节点。

票数 2
EN

Stack Overflow用户

发布于 2022-11-16 15:34:07

我不得不管理我花了很长时间和Quartz一起处理这个问题,然后才意识到创建一个新的线程

代码语言:javascript
复制
while (true) {
    doThing();
    sleep(TIME_GAP)
}

是在每个节点上运行作业的简单得多的解决方案。

记住让线程成为一个deamon线程,这样它就不会阻止JVM的关闭

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20990490

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档