一、java 定时任务调度的实现方式
1、Timer
特点是:简单易用,但由于所有任务都是由同一个线程来调度,因此所有任务都是串行执行的,同一时间只能有一个任务在执行,前一个任务的延迟或异常都将会影响到之后的任务;能实现简单的定时任务,稍微复杂点(或要求高一些)的定时任务却不好实现。
2、ScheduledExecutor
鉴于 Timer 的缺陷,Java 5 推出了基于线程池设计的 ScheduledExecutor;
特点:每一个被调度的任务都会由线程池中一个线程去执行,因此任务是并发执行的,相互之间不会受到干扰。需要注意的是,只有当任务的执行时间到来时,ScheduedExecutor 才会真正启动一个线程,其余时间 ScheduledExecutor 都是在轮询任务的状态。
虽然用 ScheduledExecutor 和 Calendar 能够实现复杂任务调度,但实现起来还是比较麻烦,对开发还是不够友善。
3、Spring Scheduler
Spring 对任务调度的实现支持,可以指定任务的执行时间,但对任务队列和线程池的管控较弱;一般集成于项目中,小任务很方便。
4、开源工具包 JCronTab
JCronTab 则是一款完全按照 crontab 语法编写的 java 任务调度工具。
特点:
- 可指定任务的执行时间;
- 提供完全按照 Unix 的 UNIX-POSIX crontab 的格式来规定时间;
- 支持多种任务调度的持久化方法,包括普通文件、数据库以及 XML 文件进行持久化;
- JCronTab 内置了发邮件功能,可以将任务执行结果方便地发送给需要被通知的人;
- 设计和部署是高性能并可扩展。
5、开源工具包 Quartz
- 具有强大的调度功能,很容易与 Spring 集成,形成灵活可配置的调度功能;
- 调度环境的持久化机制:可以保存并恢复调度现场,即使系统因为故障关闭,任务调度现场的数据并不会丢失;timer 没有这些特点;
- 灵活的应用方式:可以灵活的定义触发器调度的时间表,并可以对触发器与任务进行关联映射;
- 分布式与集群能力;
二、什么是 Quartz?
Quartz是 OpenSymphony 开源组织在 Job scheduling 领域又一个开源项目,完全由 Java 开发,可以用来执行定时任务,类似于 java.util.Timer。但是相较于 Timer,Quartz 增加了很多功能:
- 持久性作业 - 就是保持调度定时的状态;
- 作业管理 - 对调度作业进行有效的管理;
三、Quartz的相关概念
- Scheduler:调度器,进行任务调度;quartz的大脑。
- Job:业务job,亦可称业务组件;定时任务的具体执行业务需要实现此接口,调度器会调用此接口的execute方法完成我们的定时业务。
- JobDetail:用来定义业务Job的实例,我们可以称之为quartz job,很多时候我们谈到的job指的是JobDetail。
- Trigger:触发器,用来定义一个指定的Job何时被执行。
- JobBuilder:Job构建器,用来定义或创建JobDetail的实例;JobDetail限定了只能是Job的实例。
- TriggerBuilder:触发器构建器,用来定义或创建触发器的实例。
四、springboot整合Quartz
1、pom.xml中引入依赖
<!--quartz依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
2、application.xml 中添加配置项
spring:
data