1.Quartz介绍
官网:Quartz Enterprise Job Scheduler
2.Quartz框架的使用思路
1)job - 任务 - 你要做什么事?
2)Trigger - 触发器 - 你什么时候去做?
3)Scheduler - 任务调度 - 你什么时候需要去做什么事?
3.SpringBoot整合Quartz框架
添加Quartz依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
1.自定义一个job类
@Component
public class JobDemo {
public void print(){
System.out.println("当前时间"+new Date());
}
}
2.编写quartz配置类
@Configuration
public class JobConfig {
/**
* 做什么
* @param jobDemo
* @return
*/
@Bean
public MethodInvokingJobDetailFactoryBean methodInvokingJobDetailFactoryBean(JobDemo jobDemo){
MethodInvokingJobDetailFactoryBean jobDetailFactoryBean = new MethodInvokingJobDetailFactoryBean();
jobDetailFactoryBean.setTargetObject(new JobDemo());
jobDetailFactoryBean.setTargetMethod("print");
return jobDetailFactoryBean;
}
/**
* 什么时候
* @param jobDetailFactoryBean
* @return
*/
@Bean
public CronTriggerFactoryBean cronTriggerFactoryBean(MethodInvokingJobDetailFactoryBean jobDetailFactoryBean){
CronTriggerFactoryBean cronTriggerFactoryBean = new CronTriggerFactoryBean();
cronTriggerFactoryBean.setCronExpression("*/1 * * * * ?");
cronTriggerFactoryBean.setJobDetail(jobDetailFactoryBean.getObject());
return cronTriggerFactoryBean;
}
/**
* 什么时候做什么事
* @param cronTriggerFactoryBean
* @return
*/
@Bean
public SchedulerFactoryBean schedulerFactoryBean(CronTriggerFactoryBean cronTriggerFactoryBean){
SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
schedulerFactoryBean.setTriggers(cronTriggerFactoryBean.getObject());
return schedulerFactoryBean;
}
}
3.编写启动类
@SpringBootApplication
public class IcanJobApplication {
public static void main(String[] args) {
SpringApplication.run(IcanJobApplication.class,args);
}
}
查看控制台:
运行启动类,观察控制台,可以发现每隔1秒会输出一次,说明每隔1秒自定义 Job被调用一次。
4.Corn表达式
Cron 表达式是一个字符串,分为 6 或 7 个域,每一个域代表一个含义
Cron 有如下两种语法格式:
(1)Seconds Minutes Hours Day Month Week Year
(2)Seconds Minutes Hours Day Month Week
一、结构
corn 从左到右(用空格隔开):秒 分 小时 月份中的日期 月份 星期中的日期 年份
二、cron表达式
字段含义:
示例:
?:
“?”字符只在日期域和星期域中使用。它被用来指定“非明确的值”。
例如:
想在每月的20日触发调度0 0 0 20 * ?,而且只能使用如下写法:0/1 0 0 20 * ?。其中最后一位只能用?,而不能使 用*,因为*表示不管星期几都会触发恰好与20冲突。
练习:
周一至周五的上午10:15触发
表示在每月的1日的凌晨2点调整任务
朝九晚五工作时间内每半小时
每天上午10点,下午2点,4点
表示每个星期三中午12点
在每天下午2点到下午2:59期间的每1分钟触发
在每天下午2点到下午2:05期间的每1分钟触发
在每天下午2点到下午2:55期间的每5分钟触发
在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
答案:
* * * * * ?
0 15 10 ? * 2-6
0 0 2 1 * ?
0 */30 9-17 * * ?
0 0 10,14,16 * * ?
0 0 12 ? * 4
0 0-59/1 14 * * ?
0 0-5/1 14 * * ?
0 0-55/5 14 * * ?
0 0-55/5 14,18 * * ?
5.cron表达式在线生成器
前面介绍了cron表达式,但是自己编写表达式还是有一些困难的,我们可以借助一些 cron表达式在线生成器来根据我们的需求生成表达式即可。