使用 Quartz 跨多个无状态应用服务器计划单个作业
我在负载均衡器后面有一层相同的应用服务器。出于操作原因,我有一个约束,即两个应用程序服务器上的应用程序配置必须相同,以便可以轻松添加和删除节点。所有应用服务器共享同一数据库。应用服务器不会/不会群集。
到目前为止,这一直工作正常,但现在我希望有一个计划的作业,该作业仅在其中一个应用程序服务器上执行。所有应用服务器都将运行 Quartz,并具有相同的运行作业计划。触发器将在每个应用服务器上触发,但我只希望只有一个应用服务器实际执行作业 - 基本上它们都争先恐后地启动,只有一个实际启动,其余的应用服务器只是忽略作业。这里的想法是,如果我们丢失了一个应用程序服务器,另一个应用程序服务器将运行该作业,如果我们添加新的应用程序服务器,它们将轮流运行作业。
我计划通过在数据库中设置一个“作业锁定”表来做到这一点,所有应用程序服务器都会在开始作业之前读取该表,并且仅在作业“解锁”时才启动。首先对表进行更新的应用服务器将通过将表更新为运行状态/在作业结束时将其重置来实质上阻止其他应用服务器。
在我构建这个之前,我很感激那些对Quartz有更多经验的人的一些意见:
a) 我能否将此行为挂钩到 Quartz 中,这样就不必按作业完成?也就是说,开发人员可以添加新作业,而不必担心作业锁定,因为它被抽象掉了。
b)Quartz是否提供任何内置机制来实现与上述类似的目标,因此我不必自己滚动?
谢谢!