一、前言
几乎所有系统都需要定时任务,如果系统中定时任务比较少并且是单机环境的直接使用SpringTask即可,如果定时任务比较多且需要经常维护或者要部署在分布式环境中就要考虑使用Quartz或者xxl-job等开源框架,今天我们来了解一下Quartz的基本使用。
二、Quartz核心概念
Quartz是一款功能强大的任务调度库,它核心概念如下:
1、任务 Job
被调度的任务都要实现Job接口execute()方法。
2、触发器 Trigger
Trigger用于设置任务的执行时间,Quartz表达式就是配置在Trigger上。
3、调度器 Scheduler
任务调度器,它负责将Job与Trigger整合起来,然后根据Trigger设置的时间来执行Job,可以start、stop、pause、resume任务。
三、Quartz简单例子
1、导入依赖
注:quartz使用slf4j打印日志,需要引入logback等日志实现。
2、配置文件
quartz.properties
注:设置并行运行的线程数以及配置jobstore存储,有RAMJobStore和JDBCJobSTore两种方式,RAMJobStore当进程重启会丢失,JDBCJobSTore配置存在数据库不会丢失。
3、自定义任务
注:实现Job接口,编写任务代码
4、创建任务调度
控制台输出如下
注:以前AndroidStudio有控制台输出过滤功能,IDEA反而没有,可以安装Grep-Console插件。
四、代码中几个对象解释
1、JobDetail
用于定义任务的数据,Scheduler每次执行时会根据JobDetail创建一个新的Job实例,避免直接执行Job存在并发的问题。
2、JobExecutionContext
可以用来访问Quartz环境及Job本身明细数据。
传参数例子
调度类设置JobDataMap传给JobDetail,在任务类中通过JobExecutionContext获取传入的JobDataMap,也可以通过Trigger传给任务类。
3、Job的状态
每次Scheduler执行Job方法之前都会创建新的Job实例,如果想将数据保留以便下一个运行期,需要在任务类上加上注解PersistJobDataAfterExecution,这样每次执行JobDataMap的数据仍保留
4、常用的Trigger实现类
SimpleTrigger
用于在特定时间启动且以一个可能的间隔时间重复执行的Job任务而设计。
CronTrigger
基于Cron表达式来进行作业调度,Quartz的表达式和Crontab表达式还是有些差别的,在线表达式生成工具会分别提供Quartz和Crontab表达式的生成。
5、Other
Quartz相对 Linux的Crontab更强大,Crontab是进程调度而Quartz是线程调度,Quartz支持集群,另外Quartz还支持Listener便于进行Job的监控,因为数据可以存在DB便于做Job任务管理的可视化。Crontab的使用参见 《时区调整害了Crontab时区调整害了Crontab》。