在开发过程中经常需要用到定时执行某项任务的需求,这里记录下在SpringBoot中开启定时任务的过程。

1 启用定时任务

在SpringBoot应用程序入口类添加注解@EnableScheduling,开启定时任务支持,这里相当于一个总开关,没有这个注解后面的步骤都无效。如下图:

harmonyos 定时任务 定时任务开启_java

2 实现定时任务类

定义一个组件类,在需要定时执行的方法上添加注解@Scheduled,该注解根据参数不同可分为两种类型的定时任务:

  1. cron表达式类型
  2. 固定频率类型

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"

应用启动后,任务执行情况如下图:

harmonyos 定时任务 定时任务开启_spring_02

2.3 固定频率类型

这种适用于按照比较单一频率执行任务,可设置初始化延迟时间,相对于cron类型比较简单。

应用启动后,任务执行情况如下图:

harmonyos 定时任务 定时任务开启_harmonyos 定时任务_03

3 需要注意的地方

由于定时任务由框架自动执行,所以在任务执行方法中需要尽可能处理所有可能出现的异常,防止应用因未捕获的异常退出。

4 参考

[1] cron表达式详解