使用 Quartz 跨多个无状态应用服务器计划单个作业

2022-09-01 14:39:28

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

到目前为止,这一直工作正常,但现在我希望有一个计划的作业,该作业仅在其中一个应用程序服务器上执行。所有应用服务器都将运行 Quartz,并具有相同的运行作业计划。触发器将在每个应用服务器上触发,但我只希望只有一个应用服务器实际执行作业 - 基本上它们都争先恐后地启动,只有一个实际启动,其余的应用服务器只是忽略作业。这里的想法是,如果我们丢失了一个应用程序服务器,另一个应用程序服务器将运行该作业,如果我们添加新的应用程序服务器,它们将轮流运行作业。

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

在我构建这个之前,我很感激那些对Quartz有更多经验的人的一些意见:

a) 我能否将此行为挂钩到 Quartz 中,这样就不必按作业完成?也就是说,开发人员可以添加新作业,而不必担心作业锁定,因为它被抽象掉了。

b)Quartz是否提供任何内置机制来实现与上述类似的目标,因此我不必自己滚动?

谢谢!


答案 1

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

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

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


答案 2

推荐