9

我有一个带有多个实例的 Quartz 设置,我想在执行的任何地方中断作业。正如文档中所说,Scheduler.interrupt()方法不是集群感知的,所以我正在寻找一些常见的做法来克服这种限制。

4

2 回答 2

2

好吧,这里有一些你应该用来实现这一目标的基础知识。

在集群模式下运行时,有关当前正在运行的作业的信息在石英表中可用。例如,q_fired_triggers包含正在执行的作业。该表的第一列是负责它的调度程序名称。所以很容易知道谁在做什么。

然后,如果您启用石英实例的 JMX 导出,org.quartz.scheduler.jmx.export您将启用新的入口点来单独远程管理每个调度程序的 MBean。MBean 提供了一个方法boolean interruptJob("JobName", "JobGroup")

然后你“只是”需要在适当的调度程序实例上调用这个方法来有效地中断它。

我手动尝试了所有过程,它工作正常,只需要自动化:)

HIH

于 2012-10-29T15:00:17.420 回答
0

你说的对。在集群模式下Scheduler.interrupt()不起作用。假设作业触发器由节点中的调度程序触发,但此 API 在另一个节点中调用。

为了克服这个问题,您可以使用带有发布/订阅模型的消息代理方法(例如 JMS、RabbitMQ 等)。客户端不调用Scheduler.interrupt(),而是向消息代理发送此中断的消息,消息的有效负载包括作业详细信息的身份,即JobKey调度程序的名称((如果一个节点中使用多个调度程序)。然后,消息被所有运行 Quartz 实例的节点使用,节点通过名称找到 Quartz 调度程序,然后Scheduler.interrupt()使用从消息有效负载中获取的作业详细信息的身份执行找到的调度程序。

于 2021-08-14T14:01:26.400 回答