Quartz 与Spring Task 对比
刚好最近在用quartz, 两者进行比较下,对大家以后技术选型做参考。
1 Quartz 特点:
Quartz 是一个完全由 Java 编写的开源作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制。
1. 默认多线程异步执行
2. 一个任务在上一次调度未完成执行,下一次调度时间到时,会另起一个线程开始新的调度。在业务繁忙时,一个任务或许会有多个线程在执行,导致数据处理异常。
3. 单任务同步:配置属性,可以使一个任务的一次调度在未完成时,而不会开启下一次调度
4. 多个任务同时运行,任务之间没有直接的影响,多任务执行的快慢取决于CPU的性能
5 支持集群部署
集群通过故障切换和负载平衡的功能,能给调度器带来高可用性和伸缩性。
从本质上来说,是使集群上的每一个节点通过共享同一个数据库来工作的(Quartz通过启动两个维护线程来维护数据库状态实现集群管理,一个是检测节点状态线程,一个是恢复任务线程)。
负载平衡是自动完成的,集群的每个节点会尽快触发任务。当一个触发器的触发时间到达时,第一个节点将会获得任务(通过锁定),成为执行任务的节点。
故障切换的发生是在当一个节点正在执行一个或者多个任务失败的时候。当一个节点失败了,其他的节点会检测到并且标 识在失败节点上正在进行的数据库中的任务。任何被标记为可恢复(任务详细信息的”requests recovery”属性)的任务都会被其他的节点重新执行。没有标记可恢复的任务只会被释放出来,将会在下次相关触发器触发时执行。
2 Spring Task特点:
spring-task,可以将它比作一个轻量级的Quartz,而且使用起来很简单,除spring相关的包外不需要额外的包,而且支持注解和配置文件两种形式
1. 默认单线程同步执行
2. 一个任务执行完上一次之后,才会执行下一次调度 spring task的调度任务是串行的,意思就是如果配了多个任务的话,前面一个任务没有结束,后面的任务即使是时间到点了也不会跑。q
3. 多任务之间按顺序执行,一个任务执行完成之后才会执行另一个任务
4. 多任务并行执行需要设置线程池
5. 全程可以通过注解配置
6. 不支持分布式部署 不支持持久化,如果项目需要持久化定时任务,还是要选择Quartz比较
我看了一篇博客是用数据库锁实现springtask的集群,下面有博客地址大家以后可参考
3 两者对异常的处理
- Quartz的某次执行任务过程中抛出异常,不影响下一次任务的执行,当下一次执行时间到来时,定时器会再次执行任务。
- SpringTask不同,一旦某个任务在执行过程中抛出异常,则整个定时器生命周期就结束,以后永远不会再执行定时器任务
参考文档:
Quartz官方文档
https://www.w3cschool.cn/quartz_doc/
Spring Quartz 和 Spring Task使用比较
https://blog.csdn.net/mseeworld/article/details/53331197
深入浅出Spring task定时任务
https://blog.csdn.net/u011116672/article/details/52517247
SpringBoot开发详解(十二) -- SpringBoot中执行定时任务
https://blog.csdn.net/qq_31001665/article/details/76408929
SpringBoot使用SpringTask实现定时任务
https://yq.aliyun.com/ziliao/324968
Spring @Scheduled定时任务动态修改cron参数
https://blog.csdn.net/xht555/article/details/53121962
动态修改定时任务cron参数
https://blog.csdn.net/JE_GE/article/details/53434321
Spring+Quartz定时任务集群环境下部署的解决方法
https://blog.csdn.net/u012909738/article/details/74454810
quartz储存方式之JDBC JobStoreTX
https://blog.csdn.net/Uhzgnaw/article/details/46358333
quartz在集群环境下的最终解决方案
https://blog.csdn.net/kingice1014/article/details/52261437
http://qingshizhi.iteye.com/blog/2379029