我正在阅读有关调度的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服务通信,以指定的时间间隔导入和导出数据。
5条答案
按热度按时间trnvg8h31#
Quartz比Spring内置的调度器复杂一个数量级,包括对持久化、事务性和分布式作业的支持,尽管有Spring的API支持,Quartz还是有点像Pig。
如果您所需要的只是每隔X秒或者按照cron计划在bean上执行方法,那么
@Scheduled
(或者Spring的<task>
配置模式中的各种选项)可能就足够了roejwanj2#
我必须陈述一下我自己在Spring应用程序中使用
@Scheduled
与Quartz
作为调度实现的经验。调度作业具有以下要求:
因此,我们必须尝试使用Quartz实现(版本2.2.3)来支持作业在数据库中的持久性。一些基本结论如下:
JobListener
和TriggerListener
的用户定义的调度作业。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();
3okqufwl4#
在Spring中,你可以使用FixedRate、FixedDelay和cron来调度任务。但是大多数调度任务需要动态处理执行时间。所以在这个场景中,最好使用Quartz,因为它提供了在DBJobstore和RAMJobstore中存储调度任务的选项。
nfg76nw05#
Spring提供了一种简单的方法来实现用于调度作业的API,它工作得很好,直到我们部署了我们应用程序的多个示例。
默认情况下,Spring不能处理多个示例的调度程序同步,而是在每个节点上同时执行作业。
你可以看看ShedLock --一个Java库,它可以确保我们计划的任务在同一时间只运行一次,是Quartz的替代品。