0

我正在使用 spring 的调度,我希望有单独的调度程序,一个用于短期运行的任务,另一个用于长时间运行的任务。

造成这种情况的主要原因:

  • 在这种情况下,短期运行的任务比长期运行的任务更重要(短期运行的任务必须每分钟执行一次,长时间运行的任务每小时运行一次)
  • 如果我配置了单线程模式,长时间运行的任务会阻塞短时间运行的任务。
  • 如果我错误地配置了线程池大小,那么长时间运行的任务可能会阻塞短期运行的任务。

像这样将任务拆分为单独的调度程序有什么问题,或者约定总是在应用程序中使用单个调度程序并增加池大小?

我不知道有任何调度/任务拆分模式,所以那里的任何帮助都会很棒。我希望这个问题忽略这个问题的潜在替代框架(比如春季批次)。我对设计选择以及为什么它可能不正确更感兴趣。

4

3 回答 3

0

您可以配置多个调度程序。但是,您应该(并且必须)考虑设置正确的线程池。我们有一个类似的案例,每小时运行很少的任务,然后每晚运行很少。设置正确的 corePoolSize 和 maxPoolSize 是多个作业调度成功的关键。此外,您始终可以配置 queueCapacity 以节省达到线程限制的那一天。

于 2014-07-16T08:31:14.273 回答
0

我建议您使用 Spring 计划方法配置两个单独的任务。

@Async
@Scheduled(cron = "your cron expresion")
public void task1(){

}

@Async
@Scheduled(cron = "your cron expresion")
public void task2(){

}
于 2014-07-16T07:53:25.157 回答
0

如果您使用的是 Quartz 2.0,您可以让多个(非集群)调度程序实例使用同一组 Quartz 表,只要它们有unique instance names. 因此,您可以简单地configure separate thread pool sizes将关键作业分配给一个调度程序,而不是对另一个调度程序那么重要。此外,所有石英表中都有 SCHED_NAME 列,因此可以使用调度程序实例名称轻松分离作业。

我认为这似乎是合理的,因为您非常正确地指出长时间运行的任务可能会阻塞线程池以执行短期运行的任务。

于 2014-07-16T07:55:42.273 回答