在webapp中运行多个调度程序有什么问题吗?

时间:2014-07-16 06:58:25

标签: java spring scheduled-tasks quartz-scheduler spring-scheduled

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

主要原因:

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

将任务分成这样的单独调度程序是否有任何问题,或总是在应用程序中使用单个调度程序并提高池大小?

我不知道任何调度/任务分割模式,所以任何帮助都会很棒。我希望这个问题忽略了有可能的替代框架(如弹簧批可能)。我对设计选择以及它可能不正确的原因更感兴趣。

3 个答案:

答案 0 :(得分:0)

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

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

}

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

}

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

您可以配置多个调度程序。但是,您应该(并且必须)考虑设置正确的线程池。我们有一个类似的案例,每小时几乎没有任务运行,然后每晚运行很少。设置正确的corePoolSize和maxPoolSize是多次作业调度成功的关键。随之而来的是你总是可以配置queueCapacity来保存达到线程限制的那一天。