cron表达式是一个字符串, 用来设置定时规则, 由七部分组成, 每部分中间用空格隔开, 每部分的含义如下表所示:
| ****组成部分 | ****含义 | ****取值范围 |
| 第一部分 | Seconds (秒) | 0-59 |
| 第二部分 | Minutes(分) | 0-59 |
| 第三部分 | Hours(时) | 0-23 |
| 第四部分 | Day-of-Month(天) | 1-31 |
| 第五部分 | Month(月) | 0-11或JAN-DEC |
| 第六部分 | Day-of-Week(星期) | 1-7(1表示星期日)或SUN-SAT |
| 第七部分 | Year(年) 可选 | 1970-2099 |
另外, cron表达式还可以包含一些特殊符号来设置更加灵活的定时规则, 如下表所示:
| ****符号 | ****含义 |
| ? | 表示不确定的值。当两个子表达式其中一个被指定了值以后,为了避免冲突,需要将另外一个的值设为“?”。例如:想在每月20日触发调度,不管20号是星期几,只能用如下写法:0 0 0 20 * ?,其中最后以为只能用“?” |
| * | 代表所有可能的值 |
| , | 设置多个值,例如”26,29,33”表示在26分,29分和33分各自运行一次任务 |
| - | 设置取值范围,例如”5-20”,表示从5分到20分钟每分钟运行一次任务 |
| / | 设置频率或间隔,如"1/15"表示从1分开始,每隔15分钟运行一次任务 |
| L | 用于每月,或每周,表示每月的最后一天,或每个月的最后星期几,例如"6L"表示"每月的最后一个星期五" |
| W | 表示离给定日期最近的工作日,例如"15W"放在每月(day-of-month)上表示"离本月15日最近的工作日" |
| # | 表示该月第几个周X。例如”6#3”表示该月第3个周五 |
为了让大家更熟悉cron表达式的用法, 接下来我们给大家列举了一些例子, 如下表所示:
| ****cron表达式 | ****含义 |
| */5 * * * * ? | 每隔5秒运行一次任务 |
| 0 0 23 * * ? | 每天23点运行一次任务 |
| 0 0 1 1 * ? | 每月1号凌晨1点运行一次任务 |
| 0 0 23 L * ? | 每月最后一天23点运行一次任务 |
| 0 26,29,33 * * * ? | 在26分、29分、33分运行一次任务 |
| 0 0/30 9-17 * * ? | 朝九晚五工作时间内每半小时运行一次任务 |
| 0 15 10 ? * 6#3 | 每月的第三个星期五上午10:15运行一次任务 |
本案例基于Quartz和spring整合的方式使用。具体步骤:
(1)创建maven工程quartzdemo,导入Quartz和spring相关坐标,pom.xml文件如下
4.0.0 com.itheima quartdemo 1.0-SNAPSHOT org.springframework spring-context-support 5.0.2.RELEASE org.springframework spring-tx 5.0.2.RELEASE org.quartz-scheduler quartz 2.2.1 org.quartz-scheduler quartz-jobs 2.2.1
(2)自定义一个Job
package com.itheima.jobs;
public class JobDemo {
public void run(){
System.out.println("job execute...");
}
}
(3)提供Spring配置文件spring-jobs.xml,配置自定义Job、任务描述、触发器、调度工厂等
0/10 * * * * ?
(4)编写main方法进行测试
package com.itheima.jobs.com.itheima.app;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App {
public static void main(String[] args) {
new ClassPathXmlApplicationContext("spring-jobs.xml");
}
}
执行上面main方法观察控制台,可以发现每隔10秒会输出一次,说明每隔10秒自定义Job被调用一次。
SpringBoot内置的定时 入门- 添加依赖
org.springframework.boot spring-boot-starter
- 启动类上添加@EnableScheduling注解(Scheduling翻译为行程安排)
@SpringBootApplication
@EnableScheduling
public class SpringbootQuartzApplication {
}
- 创建定时执行任务的任务类(两种方式)
方式一:
@Component
public class SchedulerTask {
private int count = 0;
@Scheduled(cron = "*/6 * * * * ?")
private void process(){
System.out.println("this is scheduler task running " + (count++));
}
}
方式二:
@Component
public class SchedulerTask2 {
private static final SimpleDateFormat dateFormat =
new SimpleDateFormat("HH:mm:ss");
@Scheduled(fixedRate = 6000)
private void process(){
System.out.println("now time is " + dateFormat.format(new Date()));
}
}
参数说明
@Scheduled 注解可以接受两种定时的设置:
一种是我们常用的 cron="*/6 * * * * ?"
一种是 fixedRate = 6000,两种都可表示固定周期执行定时任务。
-
@Scheduled(fixedRate = 6000):上一次开始执行时间点之后 6 秒再执行。
-
@Scheduled(fixedDelay = 6000):上一次执行完毕时间点之后 6 秒再执行。
-
@Scheduled(initialDelay=1000, fixedRate=6000):第一次延迟 1 秒后执行,之后按 fixedRate 的规则每 6 秒执行一次。
-
Job任务:是一个接口,只定义一个方法 execute(JobExecutionContext context),在实现接口的execute 方法中编写所需要定时执行的 Job(任务),JobExecutionContext 类提供了调度应用的一些信息;Job 运行时的信息保存在 JobDataMap 实例中。
-
JobDetail任务详情(job的描述):Quartz 每次调度 Job 时,都重新创建一个 Job 实例,因此它不接受一个 Job 的实例,相反它接收一个 Job 实现类(JobDetail,描述 Job 的实现类及其他相关的静态信息,如 Job 名字、描述、关联监听器等信息),以便运行时通过 newInstance() 的反射机制实例化 Job。
-
rigger时间触发规则:是一个类,描述触发 Job 执行的时间触发规则,主要有 SimpleTrigger 和 CronTrigger 这两个子类。当且仅当需调度一次或者以固定时间间隔周期执行调度,SimpleTrigger 是最适合的选择;而 CronTrigger 则可以通过 Cron 表达式定义出各种复杂时间规则的调度方案:如工作日周一到周五的 15:00 ~ 16:00 执行调度等。
-
Scheduler调度器:调度器就相当于一个容器,装载着任务和时间触发器,该类是一个接口,代表一个 Quartz 的独立运行容器,Trigger 和 JobDetail 可以注册到 Scheduler 中,两者在 Scheduler 中拥有各自的组及名称,组及名称是 Scheduler 查找定位容器中某一对象的依据,Trigger 的组及名称必须唯一,JobDetail 的组和名称也必须唯一(但可以和 Trigger 的组和名称相同,因为它们是不同类型的)。Scheduler 定义了多个接口方法,允许外部通过组及名称访问和控制容器中 Trigger 和 JobDetail。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ii85xg49-1635320594737)(https://secure.wostatic.cn/static/r3JzK831M3zYZE5pWk93pg/image.png)]
Job 是作业的接口,是任务调度的对象;
JobDetail 用来描述 Job 的实现类及其他相关的静态信息,通过反射调用指定的job;
Trigger 做为作业的定时管理工具,一个 Trigger 只能对应一个作业实例,而一个作业实例可对应多个触发器;
Scheduler 做为定时任务容器,是 Quartz 最上层的东西,它提携了所有触发器和作业,使它们协调工作,每个 Scheduler 都存有 JobDetail 和 Trigger 的注册,一个 Scheduler 中可以注册多个 JobDetail 和多个 Trigger
SpringBoot整合Quartz- 导入依赖
org.springframework.boot spring-boot-starter-quartz
- 定义一个job,业务逻辑写这里
public class MyJob extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("Quartz ----> Hello, " + this.name);
}
}
- 构建JobDetail和Trigger(配置类)
@Configuration
public class QuartzConfig {
@Bean
public JobDetail myJobDetail(){
return JobBuilder.newJob(MyJob.class)//PrintTimeJob我们的业务类
.withIdentity("MyJob")//可以给该JobDetail起一个id
//每个JobDetail内都有一个Map,包含了关联到这个Job的数据,在Job类中可以通过context获取
.usingJobData("msg", "Hello Quartz")//关联键值对
.storeDurably()//即使没有Trigger关联时,也不需要删除该JobDetail
.build();
}
@Bean
public Trigger printTimeJobTrigger() {
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("0/1 * * * * ?");
return TriggerBuilder.newTrigger()
.forJob(myJobDetail())//关联上述的JobDetail
.withIdentity("quartzTaskService")//给Trigger起个名字
.withSchedule(cronScheduleBuilder)
.build();
}
}
- 启动项目就会开始打印了
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lXNz6YRE-1635320594739)(https://secure.wostatic.cn/static/qd7bUnKE6RYA5mY6mghTk7/image.png)]



