【问题标题】:Using Quartz to Schedule Single Job Across Multiple Stateless App Servers使用 Quartz 跨多个无状态应用服务器调度单个作业
【发布时间】:2023-04-02 04:26:01
【问题描述】:

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

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

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

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

a) 我可以将这种行为与 Quartz 挂钩,这样就不必在每个作业的基础上完成它了吗? IE。开发人员可以添加新作业,而不必担心作业锁定,因为它被抽象掉了。

b) Quartz 是否提供任何内置机制来实现与上述类似的功能,这样我就不必自己动手了?

谢谢!

【问题讨论】:

    标签: java quartz-scheduler


    【解决方案1】:

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

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

    负载平衡会自动发生,集群的每个节点都会尽快触发作业。当触发器的触发时间发生时,第一个获取它的节点(通过对其加锁)就是触发它的节点。`

    【讨论】:

    • 我不知道我是怎么错过的:/ 谢谢。
    • 使用 Quartz 的集群是集群环境的一种,
    • 重要提示:永远不要在单独的机器上运行集群,除非它们的时钟使用某种形式的时间同步服务(守护程序)进行同步,这种服务非常定期运行(时钟必须在一秒内)。
    • 为什么会存在时钟同步约束?如果石英试图在开始工作之前锁定一行,我不明白这里的危险。
    猜你喜欢
    • 1970-01-01
    • 2017-01-01
    • 1970-01-01
    • 2012-11-24
    • 1970-01-01
    • 1970-01-01
    • 2014-08-28
    • 2015-05-11
    • 1970-01-01
    相关资源
    最近更新 更多