Cron表达式与SpringBoot定时任务(基于注解)

说在前头:本人为大二在读学生,书写文章的目的是为了对自己掌握的知识和技术进行一定的记录,同时乐于与大家一起分享,因本人资历尚浅,发布的文章难免存在一些错漏之处,还请阅读此文章的大牛们见谅与斧正。若在阅读时有任何的问题,也可通过评论提出,本人将根据自身能力对问题进行一定的解答。

 

前言

SpringBoot基于注解的定时任务,有两种设置方式,一种是我们常用的cron表达式cron=“0/1 * * * * ?”,还有一种是fixedRate = 6000

01—fixedRate参数说明

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

02—cron表达式

①cron表达式格式:

  • {秒} {分} {时} {日} {月} {周} {年(可选)

②cron选项各项取值范围:

  • {秒}:取值范围为[0, 59],不能为空

  • {分}:取值范围为[0, 59],不能为空

  • {时}:取值范围为[0, 23],不能为空

  • {日}:取值范围为[1, 31],不能为空

  • {月}:取值范围为[1, 12]或[JAN, DEC],不能为空

  • {周}:取值范围为[1, 7]或[SUN, SAT],不能为空

  • {年}:取值范围为[1970, 2099],允许为空

③cron各种符号的意义:

  • "*"    每隔1秒/分/时触发任务

  • ","    在指定的时间里触发任务(例如:{10, 20, 30},将会在10秒/分/时、20秒/分/时、以及30秒/分/时,各触发一次调度任务)

  • "-"    在指定的时间范围内触发任务(例如:{10-20},将会在10-20秒/分/时内,每隔1秒/分/时触发调度任务)

  • "/"    代表触发步进,“/”前面的值代表初始值(“*”等同于“0”),后面的数值代表偏移量(例如:{0/10},表示的是从0秒/分/时 开始,每隔10秒/分/时 触发一次调度任务)

  • "?"    该符号{日},{周}不可以同时使用,当{日}指定了具体时间后,{周可以使用"?"作为占位符,因为{日}确定后,周也就确定了。

  • "L"    如果{日}为占位符“L”,表示这个月的最后一天

  • "W"    本月内离当天最近的工作日触发

  • "#"    用来指定具体的周数,"#"前面代表星期,"#"后面代表本月第几周,比如"2#2"表示本月第二周的星期一,"5#3"表示本月第三周的星期四,因此,"5L"这种形式只不过是"#"的特殊形式而已

03—常用的cron表达式

该表达式整理摘抄自:https://www.cnblogs.com/tomingto/p/11970279.html
"0 0 10,14,16 * * ?"每天上午10点,下午2点,4点 
"0 0/30 9-17 * * ?"朝九晚五工作时间内每半小时
"0 0 12 ? * WED"表示每个星期三中午12点
"0 0 12 * * ?"每天中午12点触发
"0 15 10 ? * *"每天上午10:15触发
"0 15 10 * * ?"每天上午10:15触发 
"0 15 10 * * ? *"每天上午10:15触发
"0 15 10 * * ? 2005"2005年的每天上午10:15触发 
"0 * 14 * * ?"在每天下午2点到下午2:59期间的每1分钟触发
"0 0/5 14 * * ?"在每天下午2点到下午2:55期间的每5分钟触发
"0 0/5 14,18 * * ?"在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
"0 0-5 14 * * ?"在每天下午2点到下午2:05期间的每1分钟触发
"0 10,44 14 ? 3 WED"每年三月的星期三的下午2:10和2:44触发
"0 15 10 ? * MON-FRI"周一至周五的上午10:15触发 
"0 15 10 15 * ?"每月15日上午10:15触发
"0 15 10 L * ?"每月最后一日的上午10:15触发
"0 15 10 ? * 6L"每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6L 2002-2005"2002年至2005年的每月的最后一个星期五上午10:15触发 
"0 15 10 ? * 6#3"每月的第三个星期五上午10:15触发

04—SpringBoot使用定时任务

了解了基本的cron表达式后,我们就可以正式开始使用SpringBoot的定时任务啦!!

①引入依赖:(加入依赖spring-boot-start即可

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <version>2.5.0</version>
        </dependency>
    </dependencies>

②启动类:(加上注解@EnableScheduling)

package com.bosen.www;
​
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
​
@SpringBootApplication
@EnableScheduling
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

③编写测试文件:(具体需要执行的方法加上注解@Scheduled。需要注意的是:因为定时任务是通过spring去管理的,所以对应的类在spring扫描阶段就应该被注册进spring的bean容器中,即对应的类需要加上注解@Component)

package com.bosen.www.task;
​
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
​
@Component
public class TaskTests {
    public static int index1 = 0;
    public static int index2 = 0;
​
    /*
     * 每秒钟执行一次
     */
    @Scheduled(cron = "0/1 * * * * ?")
    public void test1() {
        System.out.println("test1已执行"+(++index1)+"次!");
    }
​
    /*
     * 每秒钟执行一次
     */
    @Scheduled(fixedRate = 1000)
    public void test2() {
        System.out.println("test2已执行"+(++index2)+"次!");
    }
}

测试

此时我们启动整个工程后,在idea的控制台中每隔一秒钟就会打印一句话(如下图)


总结

此次文章我们主要介绍了cron表达式中各个字段的含义以及其中各个占位符表示的意义,并且通过springboot实际运用cron表达式来完成定时任务的调度。

 👇扫描二维码关注

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云丶言

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值