【SpringBoot】 “@Scheduled” 定时任务

目录

一、使用注解@EnableScheduling

二、创建任务类,定义@Component 组件

三、Cron表达式(来源于网络)


一、使用注解@EnableScheduling

在application启动类,加上@EnableScheduling 注解,Spring Boot 会会自动扫描任务类,开启定时任务。

/**
 * @author h
 */
// 扫描 所有需要的包, 包含一些自用的工具类包 所在的路径
@ComponentScan(basePackages = {"com.example"})
// 开启定时任务
@EnableScheduling
// 开启异步调用方法
@EnableAsync

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

说明:

1、@EnableScheduling 为开启定时任务。

2、@ComponentScan 定义扫描包的路径。

二、创建任务类,定义@Component 组件

创建com.weiz.tasks包,在tasks包里增加TestTask任务类,加上@Component 注解,那么TestTask就会作为组件被容器扫描到。扫描到之后,Spring Boot容器就会根据任务类里面定义的时间,定时执行了。

/**
 * @author Gong XiuYi
 * @date 2022/2/22 15:10
 **/
@Component
public class TestTask {
    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
    /**
     * 定义每过3秒执行任务
     * 系统每隔3s,会打印系统时间
     * */
    @Scheduled(fixedRate = 3000)
// @Scheduled(cron = "4-40 * * * * ?")
    public void reportCurrentTime() {
        System.out.println("现在时间:" + dateFormat.format(new Date()));
    }
}

说明:@Scheduled 是定时任务执行的时间,可以每个一段时间执行,也可以使用cron 表达式定义执行时间。

三、Cron表达式(来源于网络)

Spring Boot 定时任务支持每个一段时间执行或是使用cron 表达式定义执行时间

Cron格式

Cron表达式被用来配置CronTrigger实例。Cron表达式是一个由6,7个域(子表达式)和空格组成的字符串。每个子表达式都描述了一个单独的日程细节

是否强制

允许值

允许特殊字符

Seconds

YES

0-59

, - * /

Minutes

YES

0-59

, - * /

Hours

YES

0-23

, - * /

Day of month

YES

1-31

, - * ? / L W

Month

YES

1-12 or JAN-DEC

, - * /

Day of week

YES

1-7 or SUN-SAT

, - * ? / L #

Year

NO

empty, 1970-2099

, - * /

所以,比如一个cron表达式字符串"0 0 10 ? * MON",这表示“每周一的中午10:00”。

  上面的列表,可以清楚的看出,所有的域中的值都有特定的合法范围,每个域都可以单独配置。例如:Day of week(周中的天)必须有值(SUN—SAT)或是使用特殊字符,所以"0 0 10 ? * MON",就可以改成为"MON-FRI", "MON, WED, FRI"甚至是"MON-WED,SAT"。

 

特殊字符说明

'*' 表示域中“每个”。比如在"Minutes"域中的*表示每分钟。

'?' 用在day-of-month及day-of-week域中,表示“没有指定值”。这对于需要指定一个或者两个域的值而不需要对其他域进行设置来说相当有用。例如,我想在一个月的某一天(例如,第十),而不在乎具体是哪一天,我会把“10”放在day-of-month 域,然后“?”在day-of-week里。

'-' 指定范围,例如,“10-12”在Hours域,表示10点到12点。

',' 指定附加值,例如,“MON,WED,FRI”在day-of-week域中,表示“星期一,星期三和星期五”。

'/' 没有具体的值,用来用于指定值的增量,例如, 如果在Seconds域中,'0/15',它表示“从0开始,每隔15秒”。

'L' 只用在day-of-month及day-of-week中,这个字符是"last"的简写,但是在两个域中的意义不同。例如,在day-of-month域中的"L"表示本月的最后一天,即,一月的31日,非闰年的二月的28日。如果它用在day-of-week中,则表示"7"或者"SAT"。但是,这个字符跟在别的值后面,则表示"当月的最后的周XXX"。例如:"6L" 或者 "FRIL"都表示本月的最后一个周五。同时,也可以用来指定第某个月的最后一天的倒数第几天,如“L-3”表示某月最后一天的倒数第三天。注意:当使用'L'选项时,最重要的是不要指定列表或者值范围,否则会导致混乱。

'W' 用于day-of-week域中指定给定日(星期一星期五)最近的一天。例如:"15W",则表示“距离月中15号最近的工作日是周几”。

'#' 表示本月中的第几个周几。例如:day-of-week域中的"6#3" 或者 "FRI#3"表示“本月中第三个周五”。


相关实例

表达式

含义

0 0 12 * * ?

每天中午12点

0 15 10 ? * *

每天上午10点15

0 15 10 * * ?

每天上午10点15

0 15 10 * * ? *

每天上午10点15

0 * 14 * * ?

每天下午2点到2点59的每分钟

0 0/5 14 * * ?

每天下午2点到2点59的每5分钟

0 0/5 14,18 * * ?

每天下午2点到2点59和6点到6点55的每5分钟

0 0-5 14 * * ?

每天下午2点到2点05的每分钟

0 10,44 14 ? 3 WED

3月份每周三下午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 L-2 * ?

每个月最后一天的倒数第二天的上午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

0 0 12 1/5 * ?

每月的第一天开始,每5天的中午12点

0 11 11 11 11 ?

每年的11月11日11点11分

注意:'?' and '*' 在 day-of-week和day-of-month的影响

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值