当前位置: 首页 > 面试题库 >

在群集环境中运行的Spring Scheduled Task

马和硕
2023-03-14
问题内容

我正在编写一个具有cron作业的应用程序,该作业每60秒执行一次。该应用程序被配置为在需要时扩展到多个实例。我只想每60秒(在任何节点上)在1个实例上执行任务。开箱即用,我找不到解决方案,但令我惊讶的是,之前没有多次被问到。我正在使用Spring 4.1.6。

    <task:scheduled-tasks>
        <task:scheduled ref="beanName" method="execute" cron="0/60 * * * * *"/>
    </task:scheduled-tasks>

问题答案:

批处理和计划的作业通常在自己的独立服务器上运行,而不是面向客户的应用程序,因此将作业包含在预期在群集中运行的应用程序中并不是普遍的要求。此外,群集环境中的作业通常不需要担心同一作业的其他实例并行运行,因此隔离作业实例的要求不是很大。

一个简单的解决方案是在Spring Profile中配置你的作业。例如,如果你当前的配置是:

<beans>
  <bean id="someBean" .../>

  <task:scheduled-tasks>
    <task:scheduled ref="someBean" method="execute" cron="0/60 * * * * *"/>
  </task:scheduled-tasks>
</beans>

更改为:

<beans>
  <beans profile="scheduled">
    <bean id="someBean" .../>

    <task:scheduled-tasks>
      <task:scheduled ref="someBean" method="execute" cron="0/60 * * * * *"/>
    </task:scheduled-tasks>
  </beans>
</beans>

然后,仅在scheduled激活了配置文件(-Dspring.profiles.active=scheduled)的一台计算机上启动应用程序。

如果主服务器由于某种原因不可用,只需启动另一个启用了配置文件的服务器,一切就可以继续正常工作。

如果你还想为作业进行自动故障转移,那么事情将会改变。然后,你将需要使作业保持在所有服务器上运行,并通过公用资源(例如数据库表,集群缓存,JMX变量等)检查同步



 类似资料:
  • 我正在编写一个应用程序,它有一个cron作业,每60秒执行一次。应用程序配置为在需要时扩展到多个实例。我只想每60秒在一个实例上执行一次任务(在任何节点上)。开箱即用,我找不到解决这个问题的方法,我很惊讶以前没有人问过多次。我使用的是Spring 4.1.6。

  • > 创建了一个Spring-Boot应用程序,它启动了一个新的Ignite节点,并将其部署到Cloud Foundry上(例如,Ignite-Node1) 创建了另一个Spring-Boot应用程序,该应用程序也将启动一个新的Ignite节点,并将其部署在云铸造上(例如Ignite-Node2) 现在,尽管这两个应用程序都运行在同一个CloudFoundry环境中,但它们并没有形成Ignite集群

  • 要求是定期运行一个Java应用程序(例如每天),向客户发送电子邮件/短信通知。环境是集群/高可用性,其中多个节点将同时处于活动状态。该应用程序将部署在所有节点上,但只有一个节点应该启动并运行,即使所有节点都配置为运行。如何实现这一点。在Java应用中,使用了石英调度器。 还需要一些关于如何在Linux机器上部署这个Java应用程序的指导(像Cron作业或其他一些方式)。要求是,这个应用程序应该在服

  • 我使用Spring调度程序,使用@调度注释来调度运行文件生成服务的作业。应用程序部署在集群环境中Tomcat的5个单独节点上,用于负载平衡和故障转移。正因为如此,服务被调度了5次,这是不可能的。有没有办法将调度程序配置为仅在当前节点上运行? 有一种方法使用数据库找出当前活动节点,并在这里调用该特定实例的调度器 另一种方法是使用石英调度器 由于我无法对部署的应用程序进行重大更改,是否有简单的解决方案

  • 问题内容: 将Singleton对象重构到集群环境的最佳策略是什么? 我们使用Singleton从数据库中缓存一些自定义信息。它 主要是 只读的,但是在发生某些特定事件时会刷新。 现在,我们的应用程序需要部署在集群环境中。根据定义,每个JVM将具有自己的Singleton实例。因此,当在单个节点上发生刷新事件并且刷新其缓存时,JVM之间的缓存可能不同步。 保持缓存同步的最佳方法是什么? 谢谢。 编

  • 目前Cloud-ML生态云只有武清集群。这个集群的基本配置如下: 武清集群 集群目前包括若干台CPU和GPU节点。 集群的Endpoint为:https://cnbj2.cloudml.api.xiaomi.com