【问题标题】:Quartz Scheduler: Trigger some jobs on every cluster node and some only once per clusterQuartz 调度器:在每个集群节点上触发一些作业,有些只在每个集群上触发一次
【发布时间】:2015-04-11 23:34:29
【问题描述】:

我在集群环境中使用 Quartz Scheduler 作为 Spring bean。

我有一些用 @NotConcurrent 注释的作业,它们在每个集群中运行一次(即仅在一个节点中,仅在一个线程中)。

现在我需要在集群的每个节点上运行一个作业。 我删除了 @NotConcurrent 注释,但它只在一台机器上的每个线程上运行。它不会在其他节点上触发。

我应该用什么注释作业?

示例:带注释的 Job1 NotConcurrent 安排在午夜 => 它仅在每个午夜在 1 台机器上触发。 Job2 注解安排在午夜 => 每午夜在每台机器上触发。

谢谢。

【问题讨论】:

    标签: java spring cluster-computing quartz-scheduler job-scheduling


    【解决方案1】:

    AFAIK Quartz 作业总是在 Quartz 选择的单个节点上执行。 @NonConcurrent 注解仅防止 Quartz 在特定节点上同时执行相同的作业。

    换句话说,你不能让 Quartz 在多个节点上同时执行一个作业。它总是选择一个节点来执行作业。

    要实现您所描述的,您可能需要多个作业(使用相同的作业类并且没有关联的触发器)。然后,您将需要实现某种可以远程连接的编排器作业,例如通过 JMX 或 RMI,到各个节点并手动触发作业。

    您可能想查看我们的产品 QuartzDesk (www.quartzdesk.com),它提供了一个 Web 服务,该服务提供了一个单端点,您可以通过该端点连接到各个 Quartz 调度程序实例,例如,在它们上触发作业。

    【讨论】:

    • 谢谢。知道这个限制后,我使用带有 cron 表达式的 spring @Scheduled 注解在所有集群节点上启动该作业。这种混合方法运行良好。
    • 您好 Jan,您能否详细解释一下可能的解决方案?我有一个类似的问题,我需要在所有 Weblogic 节点上运行一个任务(目前有 2 个)。我希望能够临时做(例如从 servlet)。我已经将石英用于一些预定的工作,所以我想知道是否可以将此任务分配委托给它。谢谢
    • 这个想法是您实现您的工作人员作业,但您不会将任何触发器与它们相关联。然后,您将拥有某种与触发器相关联的编排器作业。当 Quartz 触发编排器作业时,该作业只需通过 JMX、RMI 或 JAX-WS Web 服务(如果您有 QuartzDesk)连接到您要执行工作作业的 Quartz 节点。如果您希望您的工作作业在所有 Quartz 实例上执行,那么编排器作业将简单地遍历配置的 Quartz 实例列表并通过 JMX/RMI/JAX-WS “手动”触发这些作业。
    • 如果您需要临时执行 Quartz 作业,那么您可以使用 Quartz API 来执行此操作(查找 fireJob 方法)。至于 API,它取决于 Quartz 调度程序在哪里运行。如果它在您的 servlet 正在运行的应用程序中运行,那么您可以使用“本地”API。如果您的 Quartz 调度程序在不同的应用程序中运行,可能在不同的 JVM 中,那么您需要使用一些远程 API。 Quartz 支持 RMI、JMX。我还提到了 Quartz 不提供的 JAX-WS,但它是由 QuartzDesk 提供的,您可以使用它来管理和监控您的 Quartz 调度程序、作业、触发器等。
    猜你喜欢
    • 2020-09-07
    • 1970-01-01
    • 1970-01-01
    • 2013-11-07
    • 1970-01-01
    • 1970-01-01
    • 2016-09-07
    • 2020-01-05
    • 1970-01-01
    相关资源
    最近更新 更多