在开发过程中经常需要用到定时执行某项任务的需求,这里记录下在SpringBoot中开启定时任务的过程。
1 启用定时任务
在SpringBoot应用程序入口类添加注解@EnableScheduling
,开启定时任务支持,这里相当于一个总开关,没有这个注解后面的步骤都无效。如下图:
2 实现定时任务类
定义一个组件类,在需要定时执行的方法上添加注解@Scheduled
,该注解根据参数不同可分为两种类型的定时任务:
- cron表达式类型
- 固定频率类型
2.1 定时任务类完整代码
@Component
public class ScheduledTask {
private Logger logger = LoggerFactory.getLogger(this.getClass());
/**
* 每秒钟执行一次
*/
@Scheduled(cron = "*/1 * * * * ?")
public void cronTask() {
this.logger.info("cronTask running:{}", new Date().toString());
}
/**
* 首次执行延迟5秒,之后每一秒执行一次
*/
@Scheduled(fixedDelay = 1000, initialDelay = 5000)
public void delayedTask() {
this.logger.info("delayed Task running:{}", new Date().toString());
}
}
2.2 cron表达式类型
这种类型主要就是cron表达式的写法,可实现各种类型的定时任务。下面列出几种典型的表达式写法:
# 每天上午10点,下午2点,4点
"0 0 10,14,16 * * ?"
# 朝九晚五工作时间内每半小时
"0 0/30 9-17 * * ?"
# 表示每个星期三中午12点
"0 0 12 ? * WED"
# 每天中午12点触发
"0 0 12 * * ?"
# 每天上午10:15触发
"0 15 10 ? * *"
# 每天上午10:15触发
"0 15 10 * * ?"
# 每天上午10:15触发
"0 15 10 * * ? *"
# 2005年的每天上午10:15触发
"0 15 10 * * ? 2005"
# 在每天下午2点到下午2:59期间的每1分钟触发
"0 * 14 * * ?"
# 在每天下午2点到下午2:55期间的每5分钟触发
"0 0/5 14 * * ?"
# 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
"0 0/5 14,18 * * ?"
# 在每天下午2点到下午2:05期间的每1分钟触发
"0 0-5 14 * * ?"
# 每年三月的星期三的下午2:10和2:44触发
"0 10,44 14 ? 3 WED"
# 周一至周五的上午10:15触发
"0 15 10 ? * MON-FRI"
# 每月15日上午10:15触发
"0 15 10 15 * ?"
# 每月最后一日的上午10:15触发
"0 15 10 L * ?"
# 每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6L"
# 2002年至2005年的每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6L 2002-2005"
# 每月的第三个星期五上午10:15触发
"0 15 10 ? * 6#3"
应用启动后,任务执行情况如下图:
2.3 固定频率类型
这种适用于按照比较单一频率执行任务,可设置初始化延迟时间,相对于cron类型比较简单。
应用启动后,任务执行情况如下图:
3 需要注意的地方
由于定时任务由框架自动执行,所以在任务执行方法中需要尽可能处理所有可能出现的异常,防止应用因未捕获的异常退出。
4 参考
[1] cron表达式详解