Java 定时器

Timer 缺陷

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

Quartz

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

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

Spring Task

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

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

两者对异常的处理

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

你可能感兴趣的:(Java 定时器)