@Scheduled 定时任务不生效原因

本文探讨了Spring Scheduled定时任务在本地时间调整后不生效的问题。解析了定时任务使用相对时间而非动态调整时间的机制,并提供了解决方案,即在调整时间后重启服务。

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

@Scheduled定时任务 不生效原因及解决办法

1.问题描述

在我们系统设计过程中,需要用到定时器,这时候我们用到了spring的Scheduled。系统逻辑为在每天的23:00:00( @Scheduled(cron = “0 0 23 * * ?”) )定时检测系统数据,并进行备份。用到的是cron表达式,自己测试定时器都是正常运行,可是一到测试那边定时器起作用,到了时间点一点变化都没有。
给大家安利一个在线网站,用于定时任务配置https://cron.qqe2.com,可以选择时间,系统自动生成表达式。

2.问题复现

经过一系列的排查发现,原来是测试过程中,测试先将服务启动。然后再手动调整服务器本地时间为22:59:00秒,等23点的时候,看定时任务是否执行。 因为,spring的定时器是在服务启动初始化的时候,便已经指定了下一次定时任务执行的时间,这时候手动去调整本地时间是没有效果的。

3.问题解决

我们在查看代码中可以看到,Scheduled 定时器中使用的是相对时间,即是不会随着本地时间变动而做出动态变化,在项目启动时候,便缓存了本地时间到系统服务中,后面再更改本地时间是没有效果的。
解决方案: 先把本地时间改为自己想要的时间,然后再重启服务。

### Spring Boot 中 `@Scheduled` 注解的使用方法 #### 启用调度功能 为了使定时任务生效,在应用程序的主要配置类或启动类上需添加 `@EnableScheduling` 注解[^3]。 ```java import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication @EnableScheduling public class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } } ``` #### 定义定时任务 定义一个组件类,其中包含被标记为 `@Scheduled` 的无参方法。该注解支持多种方式来设定执行频率: - **Cron 表达式**: 使用复杂的日程安排模式。 - **Fixed Rate/Interval**: 设置固定的间隔时间触发任务。 ##### Cron 表达式的例子 下面的例子展示了每分钟的第一秒运行一次的任务设置[^2]: ```java import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @Component public class ScheduledTasks { @Scheduled(cron = "0 * * * * ?") // 每整点的第 0 秒执行 public void reportCurrentTime() { System.out.println("The time is now"); } } ``` ##### Fixed Delay 或者 Fixed Rate 的例子 这里展示了一个每隔两秒钟执行一次的方法实例: ```java import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @Component public class SimpleTaskScheduler { private int count = 0; @Scheduled(fixedRate = 2000L) public void performTaskWithFixedRate() { System.out.printf("Executing task with fixed rate %d\n", ++count); } } ``` 当采用 `fixedDelay` 参数时,则是在前次调用完成后等待指定毫秒数再开始下一轮;而 `fixedRate` 则无视上次执行耗时长短,严格按照给定周期重复执行[^1].
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值