Quartz
Quartz
是java编写的,使用时直接导入依赖即可
为什么需要Quartz
什么是任务调度(计划任务)
所谓任务调度,就是执行某些具体动作的时间计划,也是计划任务
Quartz的调度功能更详细的指定时间,比Timer功能多
Quartz核心组件
Scheduler:调度器
Job:任务
Trigger:触发器
调度器来配置,计划什么时间触发什么任务,简单来说就是调度器规定什么时间做什么事情
- job(工作\任务):Quartz实现过程中提供一个接口,接口中有一个方法execute( )。
1
2
3
4
5 在这个方法中编写要进行的操作(具体要执行的任务)
我们还需要一个JobDetail的类型的对象,Quartz每次执行job时,会实例化Job对象,去调用execute( )
JobDetail是用来描述Job实现类的静态信息 - Trigger(触发器):能够描述触发指定的Job规则,分为简单触发和复杂触发
1
2
3 简单触发可以使用SimpleTrigger实现类,功能类似timer
复杂触发可以使用CronTrigger实现类,内部使用Cron表达式描述各种复杂的时间调度计划 - Scheduler(调度器):一个可以规定哪个触发器绑定哪个job的容器SpringBoot框架中,添加Quartz依赖后,调度器由SpringBoot管理,我们不需要编写
1
在调度器中保存全部的Quartz保存的任务
Cron表达式
格式:[秒] [分] [时] [日] [月] [周] [年]
序号 | 说明 | 是否必填 | 允许填写的值 | 允许的通配符 |
---|---|---|---|---|
1 | 秒 | 是 | 0-59 | , - * / |
2 | 分 | 是 | 0-59 | , - * / |
3 | 时 | 是 | 0-23 | , - * / |
4 | 日 | 是 | 1-31 | , - * ? / L W |
5 | 月 | 是 | 1-12 or JAN-DEC | , - * / |
6 | 周 | 是 | 1-7 or SUN-SAT | , - * ? / L # |
7 | 年 | 否 | empty 或1970-2099 | , - * / |
*表示任何值,如果在时的位置上编写,表示每小时都会触发
,表示分隔符,如果在分的位置上写成20,40 ,表示在20分钟和40分钟都会触发,触发两次
-表示一个区间,在秒位置上写5-10,表示在5,6,7,8,9,10都会触发
/表示递增触发,在秒位置上写5/10,表示5秒开始每隔10秒触发一次
?表示不确定值,因为我们在定日期时,一般确定日期就不确定是周几,相反确定是周几就不确定日期
L表示Last最后的意思,我们设置当月的最后一天,就在日字段上用L表示
周字段使用L,表示最后一周,一般会和1-7的数组组合
比如:6L表示本月最后一周的周五
W是work表示最近的工作日(单纯的周一到周五),如果日字段写10W表示每个月的10日最近的工作日触发,如果10日是周六,则9日就触发,如果10日是周日,则11号触发
LW通常一起使用,表示本月的最后一个工作日
表示第几个,只能使用在周字段上6#3,表示每月的第三个周五,如果#后数字写大了,是一个不存在的日期,那就不运行了
适合设计在母亲节或父亲节这样的日期运行
比如现在2.14日情人节在0时触发活动任务:“0 0 0 14 2 ?”
网络上可用的Cron表达式生成器有很多,推荐一个:http://cron.ciding.cc/
双十一的0时触发,表达式:0 0 0 11 11 ?
SpringBoot使用Quartz
csmall-stock-webapi测试Quartz
1 | <!--引入Quartz依赖--> |
创建Job的实现类
1 | public class QuartzJob implements Job { |
创建配置类
1 | //当前类是配置Spring容器中的调度器Scheduler |
测试
Nacos\Seata需要启动
其他服务和软件都可以关闭
然后启动csmall-stock模块
观察控制台输出