1. 前置
项目除了quartz 提供的基础表之外,还额外建了两张表
sys_job
:定时任务调度表- 每次新增定时任务,都会先向这张表插入一条数据,再建 quartz 任务(增删改同理)
- **项目启动时,初始化定时器 **
- 主要是防止手动修改数据库导致未同步到定时任务处理(注:不能手动修改数据库ID和任务组名,否则会导致脏数据)
- 意味着
quartz
基础表的QRTZ_JOB_DETAILS
项目每次启动都会清空更新一次
sys_job_log
定时任务调度日志表- 执行完成记录日志
项目除了quartz 提供的基础表之外,还额外建了两张表
sys_job
:定时任务调度表
quartz
基础表的QRTZ_JOB_DETAILS
项目每次启动都会清空更新一次sys_job_log
定时任务调度日志表
Quartz是一个优秀的任务调度框架, 具有以下特点:
任务调度的控制器,负责定时任务的调度,并且提供任务和触发器的增删改查等api方法。
job是实际被调度的任务,每个任务必须指定具体执行任务的实现类,实现类需要继承QuartzJobBean或者实现org.quartz.Job接口,具体的业务逻辑写在execute方法里面。
是否支持并发的注解:@DisallowConcurrentExecution
Quartz是一个完全由java编写的任务调度框架。
那么什么是任务调度呢?很多时候你可能会收到某个需求,要求程序 “ 隔某个特定的时间段 在某个特定的时间 做某个特定的事情 ”,比如:
前文展示quartz实现基于数据库的分布式任务管理和job生命周期的控制,那在分布式场景下如何解决弹性调度、资源管控、以及作业治理等呢?针对这些功能前当当团队开发了ElasticJob,2020 年 5 月 28 日ElasticJob成为 Apache ShardingSphere 的子项目;本文介绍ElasticJob以及SpringBoot的集成。
需要对分布式任务的知识体系和ElasticJob有基本的理解。
上文介绍的Timer在实际开发中很少被使用, 因为Timer底层是使用一个单线程来实现多个Timer任务处理的,所有任务都是由同一个线程来调度,所有任务都是串行执行。而ScheduledExecutorService是基于线程池的,可以开启多个线程进行执行多个任务,每个任务开启一个线程; 这样任务的延迟和未处理异常就不会影响其它任务的执行了。
需要对ScheduledExecutorService 代替 Timer的原因以及ScheduledExecutorService所在的知识体系有了解。
通常我们使用quartz只是实现job单实例运行,本例将展示quartz实现基于数据库的分布式任务管理,和控制job生命周期。
需要理解Quartz的持久化。
当程序突然被中断时,如断电,内存超出时,很有可能造成任务的丢失。 可以将调度信息存储到数据库里面,进行持久化,当程序被中断后,再次启动,仍然会保留中断之前的数据,继续执行,而并不是重新开始。
除了SpringTask,最为常用的Quartz,并且Spring也集成了Quartz的框架。本文主要介绍Quartz和基础的Quartz的集成案例。
需要了解常用的Quartz框架。
来源百度百科, 官网地址:http://www.quartz-scheduler.org/
前文我们介绍了Timer和ScheduledExecutorService是JDK内置的定时任务方案以及Netty内部基于时间轮实现的HashedWheelTimer;而主流的SpringBoot集成方案有两种,一种是Spring Sechedule, 另一种是Spring集成Quartz; 本文主要介绍Spring Schedule实现方式。
cron表达式, 以及BeanPostProcessor(方便你理解它的原理,相关介绍在之前的文章中Spring核心之控制反转(IOC)源码解析).
定时任务在实际开发中有着广泛的用途,本文主要帮助你构建定时任务的知识体系,同时展示Timer 的schedule和scheduleAtFixedRate例子;后续的文章中我们将逐一介绍其它常见的与SpringBoot的集成。
需要对定时任务的使用场景和常见的实现方式。
比如每天/每周/每月生成日志汇总,定时发送推送信息,定时生成数据表格等
除了前文介绍的ElasticJob,xxl-job在很多中小公司有着应用(虽然其代码和设计等质量并不太高,Licence不够开放,有着个人主义色彩,但是其具体开箱使用的便捷性和功能相对完善性,这是中小团队采用的主要原因);XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。本文介绍XXL-JOB以及SpringBoot的集成。
需要对分布式任务的知识体系和xxl-Job有基本的理解。