【问题标题】:Scheduling tasks to prevent overlap of processing and bandwidth usage in Java调度任务以防止 Java 中的处理和带宽使用重叠
【发布时间】:2012-10-08 13:56:54
【问题描述】:

我正在创建一个守护进程,它将运行某些预定的日志记录任务,但我担心某些点会出现瓶颈。

实际上,我有一些日志记录任务,我想每 15 分钟执行一次,而有些我只想每 30 分钟执行一次,依此类推,直到每月只需要运行一次的任务。基本上,我有一个在每个时间间隔要进行的检查列表。这些被放入队列并由线程池处理。

目前我看到任务正在运行类似这样的东西

15
15, 30
15, 30, 60
15, 30, 60, 120
15, 30, 60, 120, 240...

这意味着如果守护程序在 00:00 开始,那么到 04:00 将有五个进程同时运行,这不是它的结束。目前这导致下一个计划为 15 分钟的任务运行缓慢,并且只能访问有限的带宽。

但是,任务不必按小时运行。因此,如果 15 分钟任务在整点运行,则 30 分钟可能会在整点后 5 分钟开始,以尽量减少重叠。甚至可以将两个 30 分钟的任务(例如 00:00 和 00:30)拆分为四个 15 分钟的过程,以减少受到“一次性”类型问题的影响,但这真的让我头晕目眩。

是否有任何众所周知的方法来管理此类问题?

【问题讨论】:

  • 使用多个线程的 ScheduledExecutorService?
  • 执行任务的确切时间有多重要?您可以使用每个任务的优先级和“最多延迟 xxx 分钟”来手工制作一些决策逻辑,并尝试一次安排更少的任务。例如仅使用 2 个线程,但最多使用 4 个线程来安排高优先级任务...
  • 实际执行时间有点重要,因为我想保持执行之间的时间相当稳定,例如15 分钟是尽可能接近 15 分钟。我想我真正的问题是弄清楚这背后的时间逻辑。我希望它灵活,因为我不知道每个时间范围内需要的检查数量。所以是的,我可以手工制作它,这会很棒,我正在寻找某种方法来帮助这个调度过程。

标签: java scheduled-tasks scheduler


【解决方案1】:

好吧,从长远来看(正如我从你的问题中看到的那样),你将不得不寻找像 quartz 这样的东西。

除此之外,我还有几个问题和建议:

  1. 使用[ScheduledExecutorService][2] 管理这些线程。即使使用ScheduledExecutorService,看起来您也希望以单独的时间间隔运行它们,而不管它们的执行时间如何。 SchedulewithFixedRate 而不是 ScheduleWithFixedDelay

  2. 即使你实现了类似的东西,你的逻辑也会fail if your threads start to run on multiple hosts。 2 台运行每小时线程的主机将有效地每 30 分钟运行一次。

  3. 我希望有一个centralized management in terms of Database 来跟踪上次运行和所有情况。这与ExecutorService 一起将是可扩展且准确的。

假设您有 1000 个计划,在数据库中创建 1000 行。

列会有点像这样

id, P_Key
ScheduleName, AnyIdentifier for the daemon to run or task to do.
lastRunTime, lastTime it was run.
granularity, 15 mins, 30 mins etc.

您可以保留CreationTimeModificationTime 作为最佳做法。

【讨论】:

    【解决方案2】:

    你一定要看看Quartz,尤其是cron风格的triggers

    干杯,

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-05
      • 2021-06-04
      • 2022-12-17
      • 1970-01-01
      • 1970-01-01
      • 2021-11-09
      • 1970-01-01
      • 2012-04-12
      相关资源
      最近更新 更多