定时任务
简述
- 周期性执行、定时执行的任务
技术方案
JDK内置
Timer
- Timer底层是使用一个单线来实现多个Timer任务处理的。所有任务都是由同一个线程来调度,所有任务都是串行执行,意味着同一时间只能有一个任务得到执行,而前一个任务的延迟或者异常会影响到之后的任务
- 不建议使用
ScheduleExecutorService
- ScheduledExecutorService是基于线程池的,可以开启多个线程进行执行多个任务,每个任务开启一个线程; 这样任务的延迟和未处理异常就不会影响其它任务的执行了
- 可以替代Timer进行使用
Netty
简述
- Netty根据时间轮(Timing Wheel)开发了HashedWheelTimer工具类,用来优化I/O超时调度(本质上是延迟任务);
- 之所以采用时间轮(Timing Wheel)的结构,还有一个很重要的原因是I/O超时这种类型的任务对时效性不需要非常精准
- 时间轮(Timing Wheel)
- 时间轮(Timing Wheel)是George Varghese和Tony Lauck在1996年的论文中实现的。它在Linux内核中使用广泛,是Linux内核定时器的实现方法和基础之一
- 时间轮(Timing Wheel)是一种环形的数据结构,就像一个时钟可以分成很多格子(Tick),每个格子代表时间的间隔,它指向存储的具体任务(timerTask)的一个链表
- HashedWheelTimer
依赖
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
</dependency>
Spring集成
Schedule
Spring自带Schedule
- 相关注解
- @EnableScheduling。启用定时任务
- @Scheduled。定义任务
Quartz
简述
- Quartz是OpenSymphony开源组织在Job scheduling领域的一个开源项目
- 纯java实现,可以作为独立的应用程序,也可以嵌入在另一个独立式应用程序运行
- 强大的调度功能,Spring默认的调度框架,灵活可配置
- 作业持久化,调度环境持久化机制,可以保存并恢复调度现场
- 分布式和集群能力,可以被实例化,一个Quartz集群中的每个节点作为一个独立的Quartz使用,通过相同的数据库表来感知到另一个Quartz应用
依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
分析
- Job
- 表示一个工作,要执行的具体内容
- JobDetail
- 表示一个具体的可执行的调度程序,Job 是这个可执行程调度程序所要执行的内容,另外 JobDetail 还包含了这个任务调度的方案和策略
- Trigger
- 代表一个调度参数的配置,什么时候去调
- Scheduler
- 代表一个调度容器,一个调度容器中可以注册多个 JobDetail 和 Trigger
存储方式
- RAMJobStore(内存中)
- 在默认情况下Quartz将任务调度的运行信息保存在内存中,这种方法提供了最佳的性能,因为内存中数据访问最快。
- 不足之处是缺乏数据的持久性,当程序路途停止或系统崩溃时,所有运行的信息都会丢失
- JobStoreTX(数据库中)
- 所有的任务信息都会保存到数据库中,可以控制事务
- 如果应用服务器关闭或者重启,任务信息都不会丢失
- 可以恢复因服务器关闭或者重启而导致执行失败的任务
分布式集群
Quartz持久化JDBC方式
Elastic-job
简述
- ElasticJob 是面向互联网生态和海量任务的分布式调度解决方案,由两个相互独立的子项目 ElasticJob-Lite 和 ElasticJob-Cloud 组成。
- 它通过弹性调度、资源管控、以及作业治理的功能,打造一个适用于互联网场景的分布式调度解决方案,并通过开放的架构设计,提供多元化的作业生态
- ElasticJob 也提供了UI控制台的功能,包括作业操作和作业历史
依赖
<dependency>
<groupId>org.apache.shardingsphere.elasticjob</groupId> <artifactId>elasticjob-lite-spring-boot-starter</artifactId>
</dependency>
xxl-job
简述
- XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。
- 现已开放源代码并接入多家公司线上产品线,开箱即用
依赖
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
</dependency>
使用方式
- Bean模式(基于方法)
- Bean模式(基于类)
- GLUE模式
其它
Cron表达式
Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义