springboot集成quartz
Quartz基本原理
quartz核心要素主要包括Scheduler、Trigger、JobDetail和Job
- scheduler 实际执行调度逻辑的控制器
- Trigger 用于定义调度任务的时间规则,比如每天几点执行任务,主要有四种触发器:SimpleTrigger、CronTrigger、CalendarIntervalTrigger、DailyTimeIntervalTrigger
- Job和JobDetail 其中Job用来定义任务的真正逻辑,而JobDetail用来描述Job的定义(例如Job接口的实现类以及其他相关的静态信息)
如上图所示,一个调度器Schedular可以包含多个触发器,而每个触发器只能包含一个JobDetail,同一个Job可以包含在不同的触发器中。
SpringBoot集成Quartz步骤
第一步,引入依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.3</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.2.3</version>
</dependency>
第二步:装配Bean
@Configuration
public class QuartzConfig {
@Bean
public SchedulerFactoryBean schedulerFactoryBean(final Trigger trigger) {
SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
// 注册定时触发器
schedulerFactoryBean.setTriggers(trigger);
return schedulerFactoryBean;
}
@Bean
public CronTriggerFactoryBean cronTriggerFactoryBean(final JobDetail jobDetial) {
CronTriggerFactoryBean cronTriggerFactoryBean = new CronTriggerFactoryBean();
// 定时触发器绑定任务
cronTriggerFactoryBean.setJobDetail(jobDetial);
cronTriggerFactoryBean.setCronExpression("0/2 * * * * ?");
return cronTriggerFactoryBean;
}
@Bean
public MethodInvokingJobDetailFactoryBean methodInvokingJobDetailFactoryBean() {
MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean();
jobDetail.setTargetObject(printTask());
jobDetail.setTargetMethod("print");
return jobDetail;
}
@Bean
public PrintTask printTask() {
return new PrintTask();
}
}
public class PrintTask {
private Logger log = LoggerFactory.getLogger(PrintTask.class);
public void print() {
log.info("hello world!");
}
}
SchedulerFactoryBean、CronTriggerFactoryBean、MethodInvokingJobDetailFactoryBean这三个类都继承了大名鼎鼎的FactoryBean接口,该接口定义了生产Bean的类型,并由spring装配到容器中。我们这里用到的触发器是CronTrigger,该触发器支持cron表达式,功能强大,能满足多种场景。
触发器的种类
- Simple Trigger 简单触发器,间隔触发。
- CalendarIntervalTrigger:日历触发器 ,例如每月最后一天触发,而不关心一个月多少天。
- CronTrigger:con表达式触发器 ,支持cron表达式,定点触发。
- DailyTimeIntervalTrigger:每天触发器,例如每天的8:00-12:00,每隔90分钟执行一次。
间隔只关心时间段,不关心时间点,而定点只关心时间点,不关心时间段。
cron表达式
格式: [Seconds] [Minutes] [Hours] [Day-of-Month] [Month] [Day-of-Week] [Year]
号 | 说明 | 是否必填 | 允许填写的值 | 允许的通配符 |
---|---|---|---|---|
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 | , - * / |
- ***** :代表所有可能的值。因此,“*”在Month中表示每个月,在Day-of-Month中表示每天,在Hours表示每小时
- - :表示指定范围。
- , :表示列出枚举值。例如:在Minutes子表达式中,“5,20”表示在5分钟和20分钟触发。
- / :被用于指定增量。例如:在Minutes子表达式中,“0/15”表示从0分钟开始,每15分钟执行一次。“3/20"表示从第三分钟开始,每20分钟执行一次。和"3,23,43”(表示第3,23,43分钟触发)的含义一样。
- ? :用在Day-of-Month和Day-of-Week中,指“没有具体的值”。当两个子表达式其中一个被指定了值以后,为了避免冲突,需要将另外一个的值设为“?”。例如:想在每月20日触发调度,不管20号是星期几,只能用如下写法:0 0 0 20 * ?,其中最后以为只能用“?”,而不能用“*”。
- L :用在day-of-month和day-of-week字串中。它是单词“last”的缩写。它在两个子表达式中的含义是不同的。
在day-of-month中,“L”表示一个月的最后一天,一月31号,3月30号。
在day-of-week中,“L”表示一个星期的最后一天,也就是“7”或者“SAT”
如果“L”前有具体内容,它就有其他的含义了。例如:“6L”表示这个月的倒数第六天。“FRIL”表示这个月的最后一个星期五。
注意:在使用“L”参数时,不要指定列表或者范围,这样会出现问题。 - W :“Weekday”的缩写。只能用在day-of-month字段。用来描叙最接近指定天的工作日(周一到周五)。例如:在day-of-month字段用“15W”指“最接近这个月第15天的工作日”,即如果这个月第15天是周六,那么触发器将会在这个月第14天即周五触发;如果这个月第15天是周日,那么触发器将会在这个月第 16天即周一触发;如果这个月第15天是周二,那么就在触发器这天触发。注意一点:这个用法只会在当前月计算值,不会越过当前月。“W”字符仅能在 day-of-month指明一天,不能是一个范围或列表。也可以用“LW”来指定这个月的最后一个工作日,即最后一个星期五。
- # :只能用在day-of-week字段。用来指定这个月的第几个周几。例:在day-of-week字段用"6#3" or "FRI#3"指这个月第3个周五(6指周五,3指第3个)。如果指定的日期不存在,触发器就不会触发。