在项目开发中,经常需要执行一些定时任务,比如 每月1号凌晨需要汇总上个月的数据分析报表; 每天凌晨分析前一天的日志信息等定时操作。Spring 为我们提供了异步执行定时任务调度的方式。
使用的注解:
@EnableScheduling 启动类上开启基于注解的定时任务标识的方法会进行定时处理
@Scheduled标识的方法会进行定时处理
需要通过 cron 属性来指定 cron 表达式: 秒 分 时 日 月 星期几
cron表达式:
位置 | 取值范围 | 可指定的特殊字符 |
秒 | 0-59 | , - * / |
分 | 0-59 | , - * / |
小时 | 0-23 | , - * / |
日期 | 1-31 | , - * ? / L W C |
月份 | 1-12 | , - * / |
星期 | 0-7或SUN-SAT 0和7都是周日,1-6是周一到周六 | , - * ? / L C # |
特殊字符 | 代表含义 |
, | 枚举,一个位置上指定多个值,以逗号, 分隔 |
- | 区间 |
* | 任意 |
/ | 步长,每隔多久执行一次 |
? | 日/星期冲突匹配 ,指定哪个值,另外个就是?,比如: * * * ? * 1 每周1执行,则日用? 不能用 * ,不是每一天都是周一; * * * * 2 * ? 每月2号,则星期不能用* |
L | 最后 |
W | 工作日 |
C | 和calendar联系后计算过的值 |
# | 这个月的第几个星期几,4#2,第2个星期四 |
1-5 * * * * 1到5秒,每秒都触发任务
*/5 * * * * 每隔5秒执行一次
0 */1 * * * 每隔1分钟执行一次
0 0 5-15 * * 每天5-15点整点触发
0 0-5 14 * * 在每天下午2点到下午2:05期间的每1分钟触发
0 0/5 14 * * 在每天下午2点到下午2:55期间的每5分钟触发
0 0/5 14,18 * * 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
0 0/30 9-17 * * 朝九晚五工作时间内每半小时
0 0 12 ? * WED 表示每个星期三中午12点
0 10,44 14 ? 3 WED 每年三月的星期三的下午2:10和2:44触发
0 0 23 L * ? 每月最后一天23点执行一次
0 15 10 LW * ? 每个月最后一个工作日的10点15分0秒触发任务
0 15 10 ? * 5#3 每个月第三周的星期五的10点15分0秒触发任务
实践:
1.创建service/ScheduledService 方法上添加注解 @Scheduled(cron= "*/3 * * * * MON-FRI")
package com.cc.springboot.service;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
//创建定时任务
@Service
public class ScheduledService {
private static int count=1;
// second(秒), minute(分 ), hour(时), day(天) , month(月), week(周).
// "0 * * * * MON-FRI"
// "0 * * * * MON-FRI" 代表每分钟执行一次
@Scheduled(cron= "*/3 * * * * MON-FRI")
public void dataCount(){
System.out.println("数据统计第"+count++ +"次");
}
}
2.应用类application中添加注解 类上添加注解 @EnableScheduling
package com.cc.springboot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
@EnableScheduling //开启注解版的定时任务
@EnableAsync //开启基于注解版的异步处理
@SpringBootApplication
public class Springboot11TaskApplication {
public static void main(String[] args) {
SpringApplication.run(Springboot11TaskApplication.class, args);
}
}