我在负载均衡器后面有一层相同的应用服务器。出于操作原因,我有一个约束,即两个应用服务器上的应用程序配置必须相同,以便可以轻松添加和删除节点。所有应用服务器共享同一个数据库。应用服务器不会/不会被群集。
到目前为止,这种方法运行良好,但现在我希望在一个应用服务器上执行预定的作业。所有应用服务器都将运行Quartz并具有相同的运行作业计划。触发器将在每个应用服务器上触发,但我希望只有一个应用服务器实际执行该作业 - 实际上它们都是竞争启动而且只有一个实际启动,其余的应用服务器只是忽略了该作业。这里的想法是,如果我们丢失一个应用服务器,另一个将运行该作业,如果我们添加新的应用服务器,他们将轮流运行作业。
我计划通过在数据库中创建一个“作业锁定”表来执行此操作,所有应用服务器在开始作业之前都会读取该表,并且仅在作业“解锁”时才启动。首先对表进行更新的应用服务器将通过将表更新为运行状态/在作业结束时重置它来实质上阻止其他服务器。
在我构建之前,我会感谢那些有更多石英经验的人的一些意见:
a)我可以将此行为挂钩到Quartz中,以便不必在每个作业的基础上完成吗?即开发人员可以添加新的工作,而不必担心工作锁定,因为它被抽象掉了。
b)Quartz是否提供了任何内置机制来实现类似于上面的内容,所以我不必自己滚动它?
谢谢!
答案 0 :(得分:22)
你觉得这对你有用吗? http://quartz-scheduler.org/documentation/quartz-2.x/configuration/ConfigJDBCJobStoreClustering
摘自链接
群集当前仅适用于JDBC-Jobstore(JobStoreTX或JobStoreCMT),实际上是通过让群集的每个节点共享同一个数据库来工作。
负载平衡自动发生,群集中的每个节点都尽可能快地触发作业。当触发器的触发时间发生时,获取它的第一个节点(通过锁定它)是将触发它的节点。