本文已参与「新人创作礼」活动,一起开启掘金创作之路。
Spring定时任务
在实际开发场景中,会有定时任务的需求,大多都会在半夜去做一些系统更新操作,或者定期删除历史数据等等。
在开发过程中,可以使用注解的方式,@Scheduled,源代码如下:
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Repeatable(Schedules.class)
public @interface Scheduled {
/**
* A special cron expression value that indicates a disabled trigger: {@value}.
* <p>This is primarily meant for use with ${...} placeholders, allowing for
* external disabling of corresponding scheduled methods.
* @since 5.1
*/
String CRON_DISABLED = "-";
......
}
Java配置中开启对schedule的支持,在启动类上添加@EnableScheduling即可开启定时任务
@SpringBootApplication
@EnableScheduling
public class AppBoot {
}
定时修改数据状态的例子:
@Component
public class ModifyStatusJob {
private static final Logger logger = LoggerFactory.getLogger(ModifyStatusJob.class);
@Autowired
private ModifyService modifyService;
@Scheduled("0 0 0 * * ?")
public void executeModifyStatus() {
}
}
启动 Spring Boot 项目在控制台就会看到任务定时执行。
corn表达式
Cron有如下两种语法格式:
Seconds Minutes Hours DayofMonth Month DayofWeek Year
Seconds Minutes Hours DayofMonth Month DayofWeek
其中corn表达式是有空格分隔的时间元素,按顺序依次为
秒(0~59)
分钟(0~59)
小时(0~23)
天(月)(0~31,但是你需要考虑你月的天数)
月(1~12)
天(星期)(1~7 1=SUN 或 SUN,MON,TUE,WED,THU,FRI,SAT)
7.年份(1970-2099)
例子:
"0 0 12 * * ?" 每天中午12点触发
"0 10 8 ? * *" 每天上午10:10触发
"0 0 0 * * ?" 每天晚上12点触发
"0 0 8 * * ? 2022" 2022年的每天上午8点触发
配置说明
| 字段 | 允许值 | 允许的特殊字符 |
|---|---|---|
| 秒(Seconds) | 0~59的整数 | , - * / 四个字符 |
| 分(Minutes) | 0~59的整数 | , - * / 四个字符 |
| 小时(Hours) | 0~23的整数 | , - * / 四个字符 |
| 日期(DayofMonth) | 1~31的整数(需要考虑月的天数) | , - * ? / L W C 八个字符 |
| 月份(Month) | 1~12的整数或者JAN-DEC | , - * / 四个字符 |
| 星期(DayofWeek) | 1~7的整数或者SUN-SAT(1=SUN) | , - * ? / L W C 八个字符 |
| 年(可选,留空)(Year) | 1970~2099的整数 | , - * / 四个字符 |
特殊字符
* 表示所有可能的值;
? 表示不指定值,即不关心它为何值;
- 表示一个指定的范围;
, 表示附加一个可能值;
/ 符号前表示开始时间,符号后表示每次递增的值;
L (“last”) “L” 用在月份字段意思是 “这个月最后一天”;用在星期字段, 它简单意思是 “7” or “SAT”。 如果在星期字段里和数字联合使用,它的意思就是 “这个月的最后一个星期几” – 例如:0 15 10 ? * 6L 表示每月的最后一个星期五上午10:15触发.
W (“weekday”) 只能用在月份字段。用来描叙最接近指定天的工作日(周一到周五)。例如:在月份字段用“15W”指“最接近这个月第15天的工作日”,即如果这个月第15天是周六,那么触发器将会在这个月第14天即周五触发;如果这个月第15天是周日,那么触发器将会在这个月第 16天即周一触发;如果这个月第15天是周二,那么就在触发器这天触发。注意一点:这个用法只会在当前月计算值,不会越过当前月。“W”字符仅能在 月份指明一天,不能是一个范围或列表。也可以用“LW”来指定这个月的最后一个工作日。
#只能用在星期字段。用来指定这个月的第几个周几。例:在星期字段用"6#3"指这个月第3个周五(6指周五,3指第3个)。如果指定的日期不存在,触发器就不会触发。