一尘不染

使用Quartz跨多个无状态App服务器调度单个作业

java

我在负载均衡器后面有一层相同的应用程序服务器。出于操作原因,我的约束是两个应用程序服务器上的应用程序配置必须相同,以便可以轻松添加和删除节点。所有应用服务器共享相同的数据库。应用服务器未/将不会集群。

到现在为止,它一直运行良好,但是现在我希望有一个计划的作业,该作业恰好在其中一个应用程序服务器上执行。所有应用服务器都将运行Quartz,并且具有相同的运行时间表。触发器将在每台应用服务器上触发,但我只希望一台应用服务器实际执行该作业-
本质上,它们都竞相启动,而实际上只有一台启动,其余的应用服务器只是忽略该作业。这里的想法是,如果我们丢失一台应用服务器,则将由另一台服务器运行该作业,并且如果添加新的应用服务器,它们将轮流运行作业。

我打算通过在数据库中有一个“作业锁定”表来做到这一点,所有应用程序服务器在开始作业之前都将读取该表,并且仅在“解锁”作业时才启动。首先对表进行更新的应用服务器实质上将通过将表更新为运行状态/在作业结束时将其重置来阻止其他表。

在构建此库之前,我希望感谢那些对Quartz有更多经验的人员提供的一些意见:

a)我可以将此行为挂接到Quartz中,这样就不必在每个作业中都完成它了吗?即,开发人员可以添加新作业,而不必担心作业锁定,因为它被抽象了。

b)Quartz是否提供任何内置机制来实现与上述相似的功能,所以我不必自己动手做?

谢谢!


阅读 356

收藏
2020-12-03

共1个答案

一尘不染

您认为这对您有用吗? http://www.quartz-
scheduler.org/documentation/quartz-2.3.0/configuration/ConfigJDBCJobStoreClustering.html
链接摘录

群集当前仅适用于JDBC-Jobstore(JobStoreTX或JobStoreCMT),并且实质上是通过使群集的每个节点共享同一数据库来工作的。

负载平衡是自动发生的,群集中的每个节点都会尽快启动作业。当触发器的触发时间发生时,要获取它的第一个节点(通过在其上放置锁)将是触发它的节点。

2020-12-03