U2647's blog 一个热爱学习的 Java 程序员,喜欢 Vue,喜欢深度学习 Dubbo Flutter SpringBoot Debug Notes Java LeetCode Python Redis Android DesignPattern mdi-home-outline 首页 mdi-cloud-outline 标签云 mdi-timeline-text-outline 时间轴 mdi-draw-pen 文章总数 62
Spring Boot 学习笔记(十二) 整合 定时任务 Spring Boot 学习笔记(十二) 整合 定时任务 Spring Boot Scheduled 定时任务 cron mdi-cursor-default-click-outline 点击量 62

1. 启动配置

在启动类上添加EnableScheduling注解,启用定时任务

@SpringBootApplication
@EnableSwagger2
@ComponentScan({"com.zdran.springboot"})
@EnableScheduling
public class SpringbootApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootApplication.class, args);
    }

    ... ...
}

2. 创建定时任务

创建一个简单的定时任务

@Component
public class HelloTask {
    private static int count = 1;
    private Logger logger = LoggerFactory.getLogger(HelloTask.class);

    @Scheduled(fixedRate = 5000)
    public void printHello() {
        logger.info("Hello 定时任务开始。");
        logger.info("Hello Task! count = {}", count++);
        logger.info("Hello 定时任务结束。");
    }
}

启动项目会看到每隔5000毫秒会执行一下这个方法。

3. Scheduled注解

  • @Scheduled(fixedRate = 5000) :上一次开始执行时间点之后5秒再执行
  • @Scheduled(fixedDelay = 5000) :上一次执行完毕时间点之后5秒再执行
  • @Scheduled(initialDelay=1000, fixedRate=5000) :第一次延迟1秒后执行,之后按fixedRate的规则每5秒执行一次

4. cron 表达式

还可以通过 cron表达式指定执行时间。类似于 @Scheduled(cron=”*/5 * * * * *”)

Cron表达式由7个部分组成,各部分用空格隔开,每个部分的含义如下:

Seconds Minutes Hours Day-of-Month Month Day-of-Week Year
  • Seconds
    秒:数字0-59
  • Minutes
    分:数字0-59
  • Hours
    时:数字0-23
  • Day-of-Month
    月中的几号:可以用数字1-31,但要注意一些特别的月份
  • Month
    月:可以用0-11 或用字符串 “JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV and DEC” 表示
  • Day-of-Week
    周:数字1-7(1 = 星期日),或用字符串“SUN, MON, TUE, WED, THU, FRI and SAT”

cron中有一些特殊符号:

  • “*” :代表整个时间段.
  • “/“ :表示每多长时间执行一次
  • “0/15” :表示每隔15分钟执行一次,“0”表示为从“0”分开始;
  • “3/20” :表示每隔20分钟执行一次,“3”表示从第3分钟开始执行
  • “?”:表示每月的某一天,或第几周的某一天

5. 趟过的坑

cron表达式中有一组组比较特殊的字段 Day-of-Month 和 Day-of-Week

如果你要求每月的几号执行,那么 Day-of-Week 就要用 “?”,

如果你要求每周的周几执行,那么 Day-of-Month 就要用 “?”,

具体是什么原因我也不知道。举个例子:有一个定时,希望每个月的 1号凌晨1点执行,那么cron表达式为0 0 1 1 * * ?

版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
我的GitHub 我的LeetCode 我的掘金
Powered by Hexo Powered by three-cards
Copyright © 2017 - {{ new Date().getFullYear() }} 某ICP备xxxxxxxx号