【问题标题】:Interrupting a job in quartz with multiple instances使用多个实例中断石英中的作业
【发布时间】:2020-06-05 16:05:27
【问题描述】:

我有 5 个在集群模式下使用石英的应用程序实例,它们都在运行石英调度程序。 (使用 postgresql)

org.quartz.jobStore.isClustered:true
org.quartz.scheduler.instanceName: myInstanceName
org.quartz.scheduler.instanceId: AUTO

所以我有一个工作,它开始并执行一些操作,如果需要,用新的预定时间更新自己,否则会删除自己。 (一个作业只能包含一个触发器。)

应用程序具有允许用户取消作业的 UI 界面。

当从 UI 发送中断命令时;

如果工作当前没有工作;我可以暂停或取消作业。

如果我的工作当时正在工作,我如何使用正确的实例停止工作并获取工作的当前状态?基本上我想在那一刻捕捉并保存当时的数据,哪个用户实际上是中断时刻

scheduler.interrupt(jobKey) 是否会中断我正确实现 InterruptableJob 的作业?

scheduler.interrupt() 是否确切知道哪个实例当前应该运行作业并找到正确的实例并获取作业的正确状态?

你能纠正我吗,或者我应该走哪条路?

【问题讨论】:

    标签: spring quartz-scheduler


    【解决方案1】:

    quartz 中的中断方法实现和 getCurrentlyExecutingJobs() 不支持集群,

    这意味着该方法必须在正在执行该作业的实例上运行,换句话说,只有在当前实例中运行的具有指定作业键的作业才会被中断。

    可以向所有正在运行的quartz实例广播中断请求,以取消所有正在运行的作业实例。

    来自:https://www.quartz-scheduler.org/api/2.1.7/org/quartz/Scheduler.html#interrupt(org.quartz.JobKey)

    此方法不支持集群。也就是说,它只会中断 当前执行的已识别 InterruptableJob 的实例 这个 Scheduler 实例,而不是整个集群。

    【讨论】:

    • 回复:“可以向所有正在运行的石英实例广播中断请求,以取消所有正在运行的作业实例。”您的意思是向所有运行 Quartz 的 Application 实例发送中断请求吗?如果这不是一个选项怎么办?例如,中断请求的来源不能直接寻址每个Application实例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-10
    • 2011-01-30
    • 1970-01-01
    • 2020-08-28
    • 2011-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多