【问题标题】:Quartz Scheduler Triggers not respecting priorityQuartz调度程序触发器不尊重优先级
【发布时间】:2017-10-20 14:42:24
【问题描述】:

基本上,我正在使用 Quartz Scheduler 的实现,我希望多个作业同时运行,但有些作业应该在其他作业之前运行。为此,我找到了触发器的参数“优先级”。

假设我有 4 个工作,每个工作都有自己的触发器。我这样设置优先级: job1 - 优先级 5 工作 2 - 优先级 3 job3 - 优先级 11 job4 - 优先级 8

我希望它们按以下顺序运行:job3、job4、job、1、job2

在 20 次运行中,只有大约 3 次我得到了预期的结果。对于其他人来说,要运行的第一个任务几乎是随机的,其余的都是正确排序的。一次运行类似于:job1, job3, job4, job2 OR job4, job3, job1, job2

我是否没有正确理解 Quartz 中优先级的工作原理?我无法确切地找到正在发生的事情。

【问题讨论】:

  • 你的线程池大小是多少?您是否遇到了要运行的任务多于可用线程的情况。如果所有作业都有相同的预定时间并且石英没有空闲线程来运行它们,那么所有优先级都会启动。
  • 线程池大小为 1。我认为,就像在此示例中 quartz-scheduler.org/documentation/quartz-2.x/examples/… 一样,无论如何我都应该根据优先级运行任务
  • 我们必须看两件事。 1)你的工作是如何安排的?您是否对所有作业都有相同的 cron 并期望它们同时触发,或者您是否使用诸如 intervalWithDelay 之类的东西来安排多次运行? 2) 查看 NextFireTime 的工作可能会给您更多的见解。只有当所有作业都安排在同一时间触发时,优先级才会出现。如果他们的触发时间不同,将选择调度时间最早的作业
  • 他们有相同的 NextFireTime,我可以确认。如果您想查看问题,我会追踪问题并将其发布为答案。

标签: java triggers quartz-scheduler scheduler


【解决方案1】:

这里的问题是 Quartz 不能确保当您同时安排多个具有不同优先级的作业时,您会按照您想要的顺序获得它们,除非您的工作线程已经很忙。否则,如果工作线程不忙,它会在几纳秒内选择您可以调度的具有最高优先级的作业。

就我而言,线程并不忙,所以当我安排所有作业时,quartz 有时间接手并处理我安排的第一个作业。当线程忙于处理 job1 时,其余的作业有时间安排。

你们可以按照“批量获取...”的消息来自己追查问题。

我的解决方案是对作业列表使用方法调度。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多