SpringBoot任务——定时任务
文章目录
- SpringBoot任务——定时任务
- 1.定时任务相关简介与注解
- 2.定时任务使用场景
- 3.cron表达式
- 4.定时任务举例
- 4.1 定时任务方法 注解@Scheduled(cron = "cron表达式")
- 4.2 使用**@EnableScheduling**:标注在类上开启定时任务
1.定时任务相关简介与注解
使用定时任务,顾名思义就是使其在设置好的时间点执行相对应的操作。
在springboot中可使用以下两个注解使用定时任务:@Scheduled(cron = “0 * * * * *”)
- @Scheduled(cron = “cron表达式”):标注于方法上,配置定时任务执行的时间规则
- @EnableScheduling:标注在类上,开启定时任务
2.定时任务使用场景
比如每天/每周/每月生成日志汇总,定时发送推送信息,定时生成数据表格等
3.cron表达式
cron表达式由六个值组成,分别为几秒 几分 几时 几日 几月 周几 用空格隔开
以下两表格来自: https://www.bilibili.com/video/av38657363?p=96 表格二适当加了举例
cron表达式中7个字段的说明:默认为6个
字段 | 取值范围 | 允许的特殊字符 |
秒 | 0-59 | ,-*/ |
分 | 0-59 | ,-*/ |
小时 | 0-23 | ,-*/ |
日 | 1-31 | ,-*/?LWC |
月 | 1-12 | ,-*/ |
星期 | 0-7或SUN-SAT(0和7都是SUN) | ,-*/?LC# |
年(可选) | 默认1970-2099 | , - * / |
cron表达式特殊字符说明:
特殊字符 | 含义 | 举例 |
, | 枚举, | 0,6,8,57 * * * * * 秒钟为0/6/8/57秒时执行 |
- | 区间 | 25-35 * * * * * 秒钟为25至35秒时执行 |
* | 任意 | 3 3 3 * * * 每天的3点3分3秒执行 |
/ | 步长, | 0/5 * * * * * 每隔5秒执行 |
? | 日/星期冲突匹配 | 0 0 0 ?5 MON 五月的每周一0点0分0秒执行 |
L | 最后 | 0 0 0 ?* 1L 每月的最后一个周一的0点0分0秒执行 |
# | 第几个 | 0 0 0 ? * 5#2 每个月的第二个周五的0点0分0秒执行 |
4.定时任务举例
4.1 定时任务方法 注解@Scheduled(cron = “cron表达式”)
这里写几个demo,他们的执行效果放在注释当中了。
/**
* Springboot任务——定时任务
*/
@Service
public class ScheduledService {
/**
* Scheduled注解中cron = ""指定cron表达式
* cron表达式中的六个值依次为:
* 几秒 几分 几时 几日 几月 周几 (用空格隔开)
* 范围分别为:
* 0-59 0-59 0-23 1-31 1-12 0-7(0和7都是周日)
* 例子:0 * * * * MON-SUN 整秒执行如 2020/2/28 17:45:00
*/
//*代表任意
@Scheduled(cron = "0 * * * * *")
public void testScheduled() {
Date t = new Date();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//System.out.println("整秒执行"+df.format(t));
}
//整秒执行2020-02-28 16:46:00
//整秒执行2020-02-28 16:47:00
//整秒执行2020-02-28 16:48:00
//整秒执行2020-02-28 16:49:00
// /代表步长 0/5每隔5秒执行
@Scheduled(cron = "0/5 * * * * *")
public void testScheduled2() {
Date t = new Date();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//System.out.println("测试步长符号/ 每5s执行"+df.format(t));
}
//测试步长符号/ 每5s执行2020-02-28 16:50:10
//测试步长符号/ 每5s执行2020-02-28 16:50:15
//测试步长符号/ 每5s执行2020-02-28 16:50:20
//测试步长符号/ 每5s执行2020-02-28 16:50:25
// - 代表区间 ,代表枚举 10-15,20-25表示10-15s执行且20-25s执行
@Scheduled(cron = "10-15,20-25 * * * * *")
public void testScheduled3() {
Date t = new Date();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//System.out.println("测试区间符号-和枚举符号, 10-15s执行且20-25s执行"+df.format(t));
}
//测试区间符号-和枚举符号, 10-15s执行且20-25s执行2020-02-28 16:53:10
//测试区间符号-和枚举符号, 10-15s执行且20-25s执行2020-02-28 16:53:11
//测试区间符号-和枚举符号, 10-15s执行且20-25s执行2020-02-28 16:53:12
//测试区间符号-和枚举符号, 10-15s执行且20-25s执行2020-02-28 16:53:13
//测试区间符号-和枚举符号, 10-15s执行且20-25s执行2020-02-28 16:53:14
//测试区间符号-和枚举符号, 10-15s执行且20-25s执行2020-02-28 16:53:15
//测试区间符号-和枚举符号, 10-15s执行且20-25s执行2020-02-28 16:53:20
//测试区间符号-和枚举符号, 10-15s执行且20-25s执行2020-02-28 16:53:21
//测试区间符号-和枚举符号, 10-15s执行且20-25s执行2020-02-28 16:53:22
//测试区间符号-和枚举符号, 10-15s执行且20-25s执行2020-02-28 16:53:23
//测试区间符号-和枚举符号, 10-15s执行且20-25s执行2020-02-28 16:53:24
//测试区间符号-和枚举符号, 10-15s执行且20-25s执行2020-02-28 16:53:25
@Scheduled(cron = "0 0 2 LW * ?")
public void testScheduled4() {
Date t = new Date();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("测试工作日符号W"+df.format(t));
}
}
4.2 使用**@EnableScheduling**:标注在类上开启定时任务
我这里标注在启动类上了:
@EnableScheduling//开启定时任务
@SpringBootApplication
public class SpringbootTaskApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootTaskApplication.class, args);
}
}