Spring调度:@Scheduled与Quartz

62
我正在阅读有关调度的Spring 3.0文档。我倾向于使用Quartz的Spring JobDetailBean。然而,@Scheduled注释引起了我的注意。看起来这是使用Spring Framework调度任务的另一种方式。根据文档,Spring提供了三种调度方式:
  1. @Scheduled
  2. 通过Quartz
  3. 通过JDK Timer
我对JDK计时器没有兴趣。为什么我应该选择@Scheduled而不是Quartz?(当我提到Quartz时,我的意思是使用Spring的bean包装器来使用Quartz)。
假设我的用例足够复杂,我将在指定的时间间隔内与第三方Web服务进行通信以导入和导出数据。
5个回答

45
Quartz比Spring内置的调度程序复杂一个数量级,包括支持持久化、事务性和分布式作业。即使有Spring的API支持,它也有点麻烦。如果你只需要每隔X秒或按cron计划在bean上执行方法,则@Scheduled(或Spring的<task>配置模式中的各种选项)可能已经足够了。

7
“它有点难用” - 现在已经两年了,我正在做与@chris相同的比较。通过Spring使用Quartz仍然困难吗? - Edward
7
@Scheduled支持集群吗?如果支持,那么我该如何实现它? - Rushabh Patel
7
不,@Scheduled 不支持集群或多节点环境,这似乎是它唯一的主要限制,也是许多人仍然使用 Quartz 的主要原因。 - BrianC
2
我使用了Spring的包装器来使用Quartz,并为我们公司开发了一个调度程序模块。我认为这是一个很好的选择。Quartz与Spring一起使用并不复杂。它在集群环境中可以完美地工作。我们没有发现任何问题。 - learner
4
Khalid Saleem的这篇文章很不错- http://khalidsaleem.blogspot.in/2015/03/quartz-scheduler-vs-spring-scheduler.html。基本上,Spring Scheduler (Spring 3.0+)是一种真正轻量级的实现,适用于简单的调度需求,并提供了Task Scheduling和异步方法执行的注释支持。它支持固定速率和延迟以及基于cron的调度。但是,Quartz则提供了面向企业级功能的支持,例如JTA和集群;它带有JobPersistence(JDBC&RAM存储),可用于故障安全和负载平衡目的。 - Mahesh

22
我必须陈述一下我在Spring应用程序中使用 @ScheduledQuartz 作为调度实现方案的经验。
调度任务有以下要求:
  • 最终用户应该能够保存和安排(定义执行时间)他们自己的任务
  • 在服务器停机期间安排的任务不应从作业队列中省略
因此,我们必须尝试使用Quartz实现(版本2.2.3),以支持将作业持久化到数据库中。一些基本结论如下:
  • 使用 quartz.properties 文件与 Spring 4 MVC 应用程序集成非常简单。
  • 我们有能力选择一个第二个数据库来存储从主数据库获取的作业。
  • 在服务器停机期间安排的作业开始运行,只要服务器上线。
  • 作为奖励,我们通过自定义 JobListenerTriggerListener 在主数据库中维护了一些有用(更面向用户)的关于用户定义的定时作业的信息。
  • Quartz 是在具有更复杂调度要求的应用程序中非常有帮助的库。

4
根据Quartz文档,我们可以使用一些在@Scheduler中不存在的更复杂的功能。例如:
  1. 在Quartz中,我们可以使用scheduler.standby();将调度器置于待机模式,并使用scheduler.start();重新安排它。
  2. 在执行作业之前或之后,可以使用scheduler.shutdown(true);scheduler.shutdown(false);关闭调度器。
  3. 可以存储作业以供以后使用,并在需要时触发它。
JobDetail job1 =newJob(MyJobClass.class).
withIdentity("job1","group1").
storeDurably().
build();

将新工作添加到调度程序中,并指示它“替换”具有给定名称和组(如果有)的现有工作。
JobDetail job1 = newJob(MyJobClass.class).
withIdentity("job1", "group1").
build();

1

Spring提供了一种简单的实现API来进行作业调度。它在我们部署多个应用程序实例之前运行得很好。

默认情况下,Spring无法处理多个实例上的调度程序同步。它会同时在每个节点上执行作业。

您可以查看ShedLock-这是一个Java库,可以确保我们计划的任务只在同一时间运行一次,并且是Quartz的替代方案。


0
在Spring中,您可以使用FixedRate、FixedDelay和cron来安排任务。但是,大多数计划的工作需要动态处理执行时间。因此,在这种情况下最好使用Quartz,因为它提供了将计划的工作存储在DBJobstore和RAMJobstore中的选项。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接