说在前头:本人为大二在读学生,书写文章的目的是为了对自己掌握的知识和技术进行一定的记录,同时乐于与大家一起分享,因本人资历尚浅,发布的文章难免存在一些错漏之处,还请阅读此文章的大牛们见谅与斧正。若在阅读时有任何的问题,也可通过评论提出,本人将根据自身能力对问题进行一定的解答。
前言
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表达式来完成定时任务的调度。
👇扫描二维码关注