Spring定时任务

535 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

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个)。如果指定的日期不存在,触发器就不会触发。