春季日程安排:@Scheduled与Quartz

我正在阅读有关调度的Spring 3.0文档 。 我倾向于Spring的JobDetailBean Quartz。 不过,@ Scheduled注解吸引了我的眼球。 看来这是另一种使用Spring框架调度任务的方式。 基于文档,Spring提供了三种调度方式:

  1. @Scheduled
  2. 通过石英
  3. 通过JDK定时器

我对JDK Timer没有兴趣。 为什么我应该select@Scheduled over Quartz? (当我提到Quartz时,我的意思是使用Spring的bean封装来实现Quartz)。

假设我的用例足够复杂,我将与第三方Web服务通信以按指定的时间间隔导入和导出数据。

Quartz比Spring内置的调度器复杂得多,包括对持久性,事务性和分布式作业的支持。 不过,即使是Spring的API支持,它也有点儿麻烦。

如果你只需要每X秒或按cron时间表执行一个bean的方法,那么@Scheduled (或者在Spring的<task>configuration模式中的各种选项)就足够了

我必须陈述自己在Spring应用程序中使用@ScheduledQuartz作为调度实现的经验。

调度作业有以下要求:

  • 最终用户应该有能力保存和安排(定义执行时间)自己的任务
  • 在服务器停机期间计划的作业不应该从作业队列中省略

因此,我们必须尝试使用​​Quartz实现(版本2.2.3)来支持数据库中作业的持久性。 一些基本结论如下:

  • 与Spring 4 MVC应用程序的集成并不难,使用quartz.properties文件。
  • 我们有能力select第二个数据库来存储来自主数据库的作业。
  • 只要服务器启动,在服务器停机期间计划的作业就开始运行。
  • 作为奖励,我们设法使用自定义的JobListenerTriggerListener在主数据库中维护一些关于用户定义的预定作业的有用(和更多用户导向的)信息。
  • 在具有更复杂调度要求的应用程序中,Quartz是非常有用的库。