java Spring 日程安排:@预定与Quartz

cbwuti44  于 2023-03-16  发布在  Java
关注(0)|答案(5)|浏览(112)

我正在阅读有关调度的Spring 3.0 doc文档。我倾向于Spring的JobDetailBean for Quartz。然而,@Scheduled注解吸引了我的眼球。看起来这是使用Spring框架调度任务的另一种方式。基于文档,Spring提供了三种调度方式:
1.@Scheduled
1.通过石英
1.通过JDK计时器
我对JDK Timer不感兴趣,为什么我应该选择@Scheduled而不是Quartz呢?(当我提到Quartz时,我的意思是使用Spring的bean Package 器)。
假设我的用例非常复杂,我将与第三方Web服务通信,以指定的时间间隔导入和导出数据。

trnvg8h3

trnvg8h31#

Quartz比Spring内置的调度器复杂一个数量级,包括对持久化、事务性和分布式作业的支持,尽管有Spring的API支持,Quartz还是有点像Pig。
如果您所需要的只是每隔X秒或者按照cron计划在bean上执行方法,那么@Scheduled(或者Spring的<task>配置模式中的各种选项)可能就足够了

roejwanj

roejwanj2#

我必须陈述一下我自己在Spring应用程序中使用@ScheduledQuartz作为调度实现的经验。
调度作业具有以下要求:

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

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

  • 使用www.example.com文件与Spring 4 MVC应用程序集成一点也不困难quartz.properties。
  • 我们可以选择第二个数据库来存储主数据库中的作业。
  • 在服务器停机期间计划的作业在服务器启动时开始运行。
  • 作为奖励,我们设法在主数据库中维护了一些有用的(更面向用户的)信息,这些信息是关于使用自定义JobListenerTriggerListener的用户定义的调度作业。
  • Quartz是一个非常有用的库,在应用程序中有更复杂的调度要求。
3pvhb19x

3pvhb19x3#

根据Quartz Documentation
我们可以使用@Scheduler中不存在的一些更复杂的功能。例如:
1.在Quartz中,我们可以使用scheduler.standby();将调度程序置于待机模式,然后使用scheduler.start();重新调度它。
1.使用scheduler.shutdown(true);scheduler.shutdown(false);在执行作业之前或之后关闭调度程序
1.存储作业供以后使用,并且在需要该作业时可以触发它。
JobDetail job1 =newJob(MyJobClass.class). withIdentity("job1","group1"). storeDurably(). build();
1.将新作业添加到调度程序,指示它使用给定的名称和组(如果有)“替换”现有作业。
JobDetail job1 = newJob(MyJobClass.class). withIdentity("job1", "group1"). build();

3okqufwl

3okqufwl4#

在Spring中,你可以使用FixedRate、FixedDelay和cron来调度任务。但是大多数调度任务需要动态处理执行时间。所以在这个场景中,最好使用Quartz,因为它提供了在DBJobstore和RAMJobstore中存储调度任务的选项。

nfg76nw0

nfg76nw05#

Spring提供了一种简单的方法来实现用于调度作业的API,它工作得很好,直到我们部署了我们应用程序的多个示例。
默认情况下,Spring不能处理多个示例的调度程序同步,而是在每个节点上同时执行作业。
你可以看看ShedLock --一个Java库,它可以确保我们计划的任务在同一时间只运行一次,是Quartz的替代品。

相关问题