Java 在一个webapp中运行多个调度程序是否有任何错误?

Java 在一个webapp中运行多个调度程序是否有任何错误?,java,spring,scheduled-tasks,quartz-scheduler,spring-scheduled,Java,Spring,Scheduled Tasks,Quartz Scheduler,Spring Scheduled,我正在使用spring的调度,我希望有单独的调度程序,一个用于短时间运行的任务,另一个用于长时间运行的任务 主要原因是: 在这种情况下,短时间运行的任务比长时间运行的任务更关键(短时间运行的任务必须每分钟执行一次,长时间运行一小时一次) 如果我配置了单线程模式,长时间运行的任务将阻止短时间运行的任务 如果我配置的线程池大小不正确,长时间运行的任务可能会阻止短时间运行的任务 像这样将任务拆分为单独的调度程序有什么问题吗?或者在应用程序中始终使用单个调度程序并增大池大小的惯例是什么 我不知道有任

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

主要原因是:

  • 在这种情况下,短时间运行的任务比长时间运行的任务更关键(短时间运行的任务必须每分钟执行一次,长时间运行一小时一次)
  • 如果我配置了单线程模式,长时间运行的任务将阻止短时间运行的任务
  • 如果我配置的线程池大小不正确,长时间运行的任务可能会阻止短时间运行的任务
像这样将任务拆分为单独的调度程序有什么问题吗?或者在应用程序中始终使用单个调度程序并增大池大小的惯例是什么


我不知道有任何计划/任务分割模式,因此任何帮助都会很好。我想让这个问题忽略这一点,因为可能有替代框架(比如SpringBatch)。我更感兴趣的是设计选择以及它可能不正确的原因。

我建议您使用Spring调度方法配置两个独立的任务

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

}

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

}

如果您使用的是Quartz 2.0,则可以让多个(非集群)调度程序实例使用同一组Quartz表,只要它们具有
唯一的实例名称
。因此,您可以简单地
配置单独的线程池大小
,并将关键作业分配给一个调度程序,而不是另一个调度程序。此外,所有quartz表中都有SCHED_NAME列,因此可以使用调度程序实例名称轻松地隔离作业


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

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

您使用的是什么版本的quartz?@SumeetSharma我想quartz与Spring结合使用,但我选择使用spring的原生调度。我发现使用quartz更容易,因此我建议这样做。。我个人认为,当您直接使用quartz时,您可以轻松地编辑配置。