1.需求分析
业务在某一特定时刻完成操作,例如货品自动上架或者流水定时结账等任务,因此我们需要设置定时任务。
2.实现技术
为了实现定时任务,我们需要使用Scheduled组件。它是spring3.0中内置的定时任务器,可以周期的执行一些功能,其依赖在spring-context-support.jar中。简单来说,我们在springBoot对应方法上添加@Scheduled注解,再配置参数即可实现定时任务。
3.具体步骤
1.在pox.xml中添加spring-context-support依赖
<!--Spring定时任务-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
注:这里一般不用写<version>标签,maven会根据spring自动匹配对应版本,我这里是5.3.15
2.在启动类上添加注解@EnableScheduling,控制开启定时任务功能。
package com.tjetc;
// #EnableXXX 开启某项功能的注解 是SpringBoot的风格
@EnableScheduling //开启定时任务
@SpringBootApplication
public class SpringBootMybatisApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootMybatisApplication.class, args);
}
}
3.在目标类中添加@Component组件注解,将目标类对象纳入SpringBoot容器管理中(否则目标类不在容器内,无法启动定时功能);在目标方法前面添加@Scheduled定时注解,用@Scheduled(cron)表达式声明定时任务周期。
package com.tjetc.schedule;
//要使用Springboot定时任务执行某个方法,首先方法所在类的对象纳入springboot容器管理
@Component
public class ScheduleDemo {
// @Scheduled的 是Springboot根据Cron表达式的内容 根据周期性或一次性执行方法
@Scheduled(cron = "0/2 * * * * *")
public void testDemo(){
// 定时任务要执行的逻辑
System.out.println("定时执行逻辑"+ LocalDateTime.now());
}
}
注意:这里cron表达式" "内至少6个参数,按顺序每个参数值有其特定含义。具体解析如下:
位置 |
时间域名 |
允许值 |
允许的特殊字符 |
1 |
秒 |
0-59 |
, - * / |
2 |
分钟 |
0-59 |
, - * / |
3 |
小时 |
0-23 |
, - * / |
4 |
日 |
1-31 |
, - * / L W C |
5 |
月 |
1-12 |
, - * / |
6 |
星期 |
1-7(周日到周六) |
, - * /? L C # |
7 |
年(可选) |
1970-2099 |
, - * / |
详细介绍一下每个位置允许的特殊符号 , - * / 等的含义:
逗号( , )可用于所有字段,表示对应时间值,特别说明,在星期字段中1-7表示日到六
减号(-)可用于所有字段,表示对应时间范围,例如1-5在分钟时间段,表示在第1分钟到第5分钟时间范围。
星号(*)可用于所有字段,表示时间域的每一时刻,例如每分钟,每小时,每日,每月等
斜杠(/)可用于所有字段,表示一个等步长序列,例如2/1在秒时间域,表示在时钟第2秒开始,每1秒触发一次。
问号(?) 只用于星期字段内,表示“无意义的占位符”,判断条件中,不考虑星期的时间范围
井号(#)只用于星期字段内,表示当月某个具体星期几,例如6#3,表示当月第三个星期五,1#2,表示当月第二个星期日。
L 只用于日和星期字段内,表示“LAST”的意思;在日期中L 表示当月最后一天,在星期中L 表示周六;如有X出现在L前面,则表示当月最后X天,例如7L,表示当月最后七天。
W 只用于日期字段内,和日期值联合使用,表示计算日期距离最近的工作日,例如15W表示距离当月15号最近的工作日;
C只用于日期和星期字段内,表示"Calender"的意思;在日期中表示目标日期后的每一天,在星期中表示目标星期后的每一天;例如25C,表示日期25号后面每一天,2C表示星期1后面的每一天。
4.示例演示
接下来我们来看一个示例,按照步骤三配置项目,可以看到在ScheduleDemo类中定义了一个cron表达式,设定从0秒开始,每两秒执行一次testDemo打印任务,运行结果如下:
总结:
在Springboot中开启定时任务,首先添加spring-context-support依赖,然后在启动类中添加@EnableScheduling注解,开启定时任务支持,最后在目标类的方法中添加@Scheduled(cron)表达式,执行周期任务。