Java 定时器

Timer 缺陷

  • 不支持多线程并发
  • 任务抛出异常会停止所有任务的执行

Quartz

Quartz 是一个完全由 Java 编写的开源作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制。

  • 默认多线程异步执行
  • 一个任务在上一次调度未完成执行,下一次调度时间到时,会另起一个线程开始新的调度。在业务繁忙时,一个任务或许会有多个线程在执行,导致数据处理异常。
  • 单任务同步:配置属性,可以使一个任务的一次调度在未完成时,而不会开启下一次调度。
  • 多个任务同时运行,任务之间没有直接的影响,多任务执行的快慢取决于CPU的性能。
  • 支持集群部署。
    集群通过故障切换和负载平衡的功能,能给调度器带来高可用性和伸缩性。
    从本质上来说,是使集群上的每一个节点通过共享同一个数据库来工作的(Quartz通过启动两个维护线程来维护数据库状态实现集群管理,一个是检测节点状态线程,一个是恢复任务线程)。
    负载平衡是自动完成的,集群的每个节点会尽快触发任务。当一个触发器的触发时间到达时,第一个节点将会获得任务(通过锁定),成为执行任务的节点。
    故障切换的发生是在当一个节点正在执行一个或者多个任务失败的时候。当一个节点失败了,其他的节点会检测到并且标 识在失败节点上正在进行的数据库中的任务。任何被标记为可恢复(任务详细信息的”requests recovery”属性)的任务都会被其他的节点重新执行。没有标记可恢复的任务只会被释放出来,将会在下次相关触发器触发时执行。

Spring Task

Spring Task,可以将它比作一个轻量级的Quartz,而且使用起来很简单,除spring相关的包外不需要额外的包,而且支持注解和配置文件两种形式。

  • 默认单线程同步执行。
  • 一个任务执行完上一次之后,才会执行下一次调度 spring task的调度任务是串行的,意思就是如果配了多个任务的话,前面一个任务没有结束,后面的任务即使是时间到点了也不会跑。
  • 多任务之间按顺序执行,一个任务执行完成之后才会执行另一个任务。
  • 多任务并行执行需要设置线程池。
  • 全程可以通过注解配置。
  • 不支持分布式部署 不支持持久化,如果项目需要持久化定时任务,还是要选择Quartz比较。

两者对异常的处理

Quartz:某次执行任务过程中抛出异常,不影响下一次任务的执行,当下一次执行时间到来时,定时器会再次执行任务。
SpringTask:一旦某个任务在执行过程中抛出异常,则整个定时器生命周期就结束,以后永远不会再执行定时器任务。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Timer 定时器相信都不会陌生,之所以拿它来做源码分析,是发现整个控制流程可以体现很多有意思的东西。 在业务开发...
    石先阅读 6,420评论 2 13
  • 记录几种定时器的实现方式——仅仅在应用层面,简单的实现。本文在完成过程中参考了详解java定时任务、Spring定...
    峡客阅读 4,721评论 0 21
  • Timer总结 Timer是jdk自带的定时器,可以实现单机基本的定时任务, 从指定时间开始,每隔一段时间固定执行...
    深谷9002阅读 1,143评论 0 0
  • 一.线程安全性 线程安全是建立在对于对象状态访问操作进行管理,特别是对共享的与可变的状态的访问 解释下上面的话: ...
    黄大大吃不胖阅读 878评论 0 3
  • Java-Review-Note——4.多线程 标签: JavaStudy PS:本来是分开三篇的,后来想想还是整...
    coder_pig阅读 1,690评论 2 17