springBoot定时任务@Scheduled

@Scheduled

1、注解介绍

        @Scheduled注解是Spring Boot提供的用于定时任务控制的注解,主要用于控制任务在某个指定时间执行,或者每隔一段时间执行。

2、注解参数
        

  1. fixedDelay:表示固定延迟时间执行,即上一次执行结束后,再经过固定的时间间隔才执行下一次任务。 例如:@Scheduled(fixedDelay = 5000) 表示每隔5秒执行一次任务。

  2. fixedRate:表示固定频率执行,即上一次开始执行时间点后,再经过固定的时间间隔才执行下一次任务。 例如:@Scheduled(fixedRate = 5000) 表示每隔5秒执行一次任务。

  3. initialDelay:表示初始延迟时间,即在Spring容器启动后,需要等待一段时间才开始执行定时任务。 例如:@Scheduled(initialDelay = 5000, fixedRate = 5000) 表示延迟5秒后开始执行任务,然后每隔5秒执行一次。

  4. cron:使用Cron表达式配置定时任务的执行时间。 例如:@Scheduled(cron = "0 0 12 * * ?") 表示每天中午12点执行任务。

3、注意事项

1、需要在启动类上加上 @EnableCaching注解才能使用 @Scheduled。
2、@Scheduled 注解只能用于方法上,且方法必须为 public。
3、@Scheduled 注解需要指定时间表达式,时间表达式可以是固定时间间隔、固定时间点、cron 表达式等。
4、时间表达式中的时间单位需要与方法的时间参数类型相匹配,例如方法参数为 long 类型的毫秒数,则时间表达式中的时间单位应该为毫秒。
5、如果任务的执行时间过长,下一次任务会在上一次任务完成后立即执行,可能导致任务堆积,需要考虑任务的并发性和执行时间的优化。
6、如果任务需要访问数据库等资源,需要注意线程安全问题。
7、可以使用 @Async 注解将任务异步执行,避免阻塞主线程。
8、对于集群环境,需要考虑分布式锁等机制,避免多个节点同时执行同一个任务。

4、案例:

        1、启动类上添加注解@EnableCaching,才能扫描到@Scheduled注解。

           2、创建包tasks,创建定时任务类,添加@Component注解注入ioc容器统一管理。

        3、创建方法,必须使用public方法,并且没有返回值。

corn表达式:

概念

cron表达式是一种用于指定任务在某个时间点或周期性执行的字符串表达式。它包含6个或7个域,每个域代表不同的含义,从左到右依次为"秒 分 时 日 月 星期几 年",其中年不是必须的; cron表达式的配置简洁方便,因此在定时调度任务中被广泛使用;

参数

cron表达式包含6个或7个参数,每个参数代表不同的时间单位和取值范围;

  • 秒(0-59)

  • 分钟(0-59)

  • 小时(0-23)

  • 日(1-31)

  • 月(1-12 或 JAN-DEC)

  • 星期几(0-6 或 SUN-SAT)

  • 年(可选,1970-2099)

其中,星期几和日两个参数只能出现一个或者同时出现。其它参数通过空格或逗号来区分,用“”代表所有取值范围,用"?"代表不指定,用"/"表示间隔时间。

举例与特殊符号详解

举例:

  • "0 0 8 * * *" 表示每天上午8点执行任务。

  • "0 0/30 9-17 * * *" 表示在每天9点到17点之间,每隔30分钟执行一次任务。

  • "0 0 12 ? * WED" 表示每周三中午12点执行任务。

  • "0 0 10 L * ?" 表示每个月的最后一天上午10点执行任务。

  • "0 0 3-5 * * *" 表示每天凌晨3点到5点之间,每小时执行一次任务。

  • "0 15 10 L * ?" 表示每个月的最后一天上午10:15分执行任务。

特殊符号:

  • *(通配符):匹配任意值,例如* * * * * ?表示每秒执行一次任务。

  • ,(列表):用于指定多个取值,例如0 0 6,12,18 * * ?表示每天6点、12点和18点执行任务。

  • -(范围):用于指定一个范围内的取值,例如0 0 9-17 * * MON-FRI表示周一至周五的9点到17点之间每小时执行一次任务。

  • /(步长):用于指定一个取值的步长,例如0 */30 * * * ?表示每30分钟执行一次任务。

  • ?(无意义占位符):用于指定一个字段没有具体的取值,只能与其他字段一起使用,例如0 0 12 ? * MON-FRI表示周一至周五中午12点执行任务。

  • #(日历偏移量):用于指定某个月份的第几个周几,例如0 0 0 ? * 3#1表示每个月的第一个星期三执行任务。

  • L(Last):表示某个指定时间内的最后一天,比如0 0 L * * ?表示每月的最后一天执行任务。

  • W(Weekday):表示距离指定日期最近的工作日,比如0 0 0 15W * ?表示当月第15个工作日执行任务。如果15号是工作日,则执行任务;如果15号是周末,则任务会提前到最近的工作日即14号执行。

  • C(Calendar):表示距离指定日期最近的那个日子,比如0 0 0 1W * ?表示当月的第一个工作日执行任务。如果1号是工作日,则执行任务;如果1号是周末,则任务会延后到最近的工作日即2号执行。

其中,WC的区别在于W只能用在日字段上,表示距离指定日期最近的工作日; 而C可以用在月、日、星期字段上,表示距离指定日期最近的那个日子。同时,C还可以与星期字段结合使用,比如0 0 0 ? * 2#2表示每月第二个星期二执行任务;

corn在线编译和反编译网站:Cron表达式在线生成工具 - 51tools.info您身边的在线工具

         

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值