springboot Scheduled定时器执行 ,上次任务执行完成后在执行下一次

本文深入解析了@Scheduled注解在Spring框架中支持的各种参数,包括cron表达式、fixedDelay、fixedRate等,以及如何通过这些参数实现精确的任务调度。同时,提供了大量cron表达式的实例,帮助读者理解和应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

@Scheduled所支持的参数:

1.cron:cron表达式,指定任务在特定时间执行;
2.fixedDelay:表示上一次任务执行完成后多久再次执行,参数类型为long,单位ms;
3.fixedDelayString:与fixedDelay含义一样,只是参数类型变为String;
4.fixedRate:表示按一定的频率执行任务,参数类型为long,单位ms;
5.fixedRateString: 与fixedRate的含义一样,只是将参数类型变为String;
6.initialDelay:表示延迟多久再第一次执行任务,参数类型为long,单位ms;
7.initialDelayString:与initialDelay的含义一样,只是将参数类型变为String;
8.zone:时区,默认为当前时区,一般没有用到。

Cron表达式范例:

每隔5秒执行一次:*/5 * * * * ?
每隔1分钟执行一次:0 */1 * * * ?
每天23点执行一次:0 0 23 * * ?
每天凌晨1点执行一次:0 0 1 * * ?
每月1号凌晨1点执行一次:0 0 1 1 * ?
每月最后一天23点执行一次:0 0 23 L * ?
每周星期天凌晨1点实行一次:0 0 1 ? * L
在26分、29分、33分执行一次:0 26,29,33 * * * ?
每天的0点、13点、18点、21点都执行一次:0 0 0,13,18,21 * * ?

常用示例: 
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分触发 
14 * ? 每天下午的 2点到2点59分每分触发 
0 0/5 14 ? 每天下午的 2点到2点59分(整点开始,每隔5分触发) 
0 0/5 14,18 ? 每天下午的 2点到2点59分(整点开始,每隔5分触发) 
每天下午的 18点到18点59分(整点开始,每隔5分触发) 
0 0-5 14 ? 每天下午的 2点到2点05分每分触发 
0 10,44 14 ? 3 WED 3月分每周三下午的 2点10分和2点44分触发 (特殊情况,在一个时间设置里,执行两次或 两次以上的情况) 
0 59 2 ? * FRI 每周5凌晨2点59分触发; 
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 每月的第三周的星期五开始触发 
0 0 12 1/5 * ? 每月的第一个中午开始每隔5天触发一次 
0 11 11 11 11 ? 每年的11月11号 11点11分触发(光棍节)

### Spring Boot 定时任务配置与实现 #### 启用定时任务功能 为了使 `@Scheduled` 注解生效,在应用程序的主要类或任意配置类中添加 `@EnableScheduling` 注解是必要的[^2]。 ```java import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication @EnableScheduling public class ScheduledTasksApplication { public static void main(String[] args) { SpringApplication.run(ScheduledTasksApplication.class, args); } } ``` #### 创建带有时辰调度的任务方法 定义一个带有 `@Scheduled` 注解的方法,该注解支持三种主要属性来控制执行频率: - **fixedRate**: 表示每次调用之间等待固定的毫秒数。 - **fixedDelay**: 上次调用完成后经过固定延时再启动下一次调用。 - **cron**: 使用类似于 Unix cron 的表达式来精确指定何时应该触发任务。 下面是一个简单的例子展示如何创建每五秒钟打印一条消息到日志中的计划任务[^1]: ```java import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @Component public class MyTaskScheduler { private final Logger logger = LoggerFactory.getLogger(MyTaskScheduler.class); @Scheduled(fixedRate = 5000) public void reportCurrentTime() { logger.info("The time is now {}", System.currentTimeMillis()); } // 更多复杂的调度逻辑... } ``` 对于更复杂的需求,比如每天凌晨两点钟执行某些操作,则可以利用 Cron 表达式的灵活性: ```java @Scheduled(cron = "0 0 2 * * ?") public void scheduledTaskUsingCronExpression(){ logger.info("Executing task at 2 AM every day"); } ``` #### 配置外部化参数 如果希望将这些时间间隔或者其他相关参数放在 application.properties 或者其他形式的外部配置文件里以便于管理和调整,那么可以直接引用这些属性作为 `@Scheduled` 方法上的值。例如,在 properties 文件中设置如下键值对: ```properties app.fixed-rate=5000 app.cron-expression=0 0/5 * * * ? ``` 然后修改 Java 类以读取并应用这些配置项: ```java @Scheduled(fixedRateString = "${app.fixed-rate}") // or @Scheduled(cron = "${app.cron-expression}") ``` 这样做的好处是可以轻松更改定时器的行为而无需重新编译代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值