繁体   English   中英

Spring Scheduling:@Scheduled vs Quartz

[英]Spring Scheduling: @Scheduled vs Quartz

我正在阅读关于调度的Spring 3.0文档 我倾向于Spring的JobDetailBean for Quartz。 但是@Scheduled注释引起了我的注意。 看来这是使用Spring Framework调度任务的另一种方式。 基于文档,Spring提供了三种调度方式:

  1. @Scheduled
  2. 通过石英
  3. 通过JDK Timer

我对JDK Timer没兴趣。 我为什么要选择@Scheduled而不是Quartz? (当我提到Quartz时,我的意思是使用Spring的bean包装器进行Quartz)。

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

Quartz比Spring的内置调度程序复杂一个数量级,包括对持久,事务和分布式作业的支持。 尽管如此,即使使用Spring的API支持,它也有点像猪。

如果您需要的是每隔X秒或在cron调度上对bean执行方法,那么@Scheduled (或Spring的<task> config schema中的各种选项)可能就足够了

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

调度作业具有以下要求:

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

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

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

根据Quartz文档

我们可以使用@Scheduler中不存在的更复杂的功能。 例如:

  1. 在Quartz中,我们可以使用scheduler.standby();将调度程序置于待机模式scheduler.standby(); 并使用scheduler.start();重新安排它scheduler.start();
  2. 在执行作业之前或之后使用scheduler.shutdown(true);关闭调度scheduler.shutdown(true); scheduler.shutdown(false);
  3. 存储作业供以后使用,当您需要该作业时,您可以触发它。

JobDetail job1 =newJob(MyJobClass.class). withIdentity("job1","group1"). storeDurably(). build();

  1. 将新作业添加到调度程序,指示它使用给定的名称和组(如果有)“替换”现有作业。

JobDetail job1 = newJob(MyJobClass.class). withIdentity("job1", "group1"). build();

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM