java spring boot 定时任务

发布于:2025-03-28 ⋅ 阅读:(28) ⋅ 点赞:(0)
@Scheduled(cron = "0 0 0 * * ?")
    @SchedulerLock(name = "ProImpl.sendUserMsg", lockAtMostFor = "PT10M", lockAtLeastFor = "PT1M")
    public void sendUserMsg() {

    }

这段代码是 Spring Boot 中的 定时任务,结合 ShedLock 进行分布式任务调度,用于在多个实例中防止任务的并发执行。

### 代码解析

java
@Scheduled(cron = "0 0 0 * *  ?")

 @Scheduled 注解用于定时执行方法。
 cron = "0 0 0   ?" 代表 每天午夜 00:00 执行(秒 分 时 日 月 星期)。
   0 0 0   ?:
     秒:0
     分钟:0
     小时:0
     日:(每天)
     月:(每月)
     星期:?(不指定)

java
@SchedulerLock(
    name = "CustomerActivityInfoServiceImpl.updateActivityBusinessStatus",
    lockAtMostFor = "PT10M",
    lockAtLeastFor = "PT1M"
)

 @SchedulerLock 是 ShedLock 提供的分布式锁,用于防止多个实例同时执行该定时任务。
 参数解析:
   name = "CustomerActivityInfoServiceImpl.updateActivityBusinessStatus"  
     任务的唯一标识符(锁的名称)。
   lockAtMostFor = "PT10M"  
     最多锁定 10 分钟,如果方法执行时间超过 10 分钟,锁会自动释放,避免死锁。
   lockAtLeastFor = "PT1M"  
     至少锁定 1 分钟,即使任务执行时间小于 1 分钟,也不会立即释放锁,防止频繁触发。

java
public void updateActivityBusinessStatus() {

 这是定时任务执行的方法,具体逻辑会在这个方法里实现,比如更新数据库、调用 API 等。

### 总结
这段代码的作用:
1. 每天午夜(00:00)执行 updateActivityBusinessStatus() 方法。
2. 防止多个实例同时执行(使用 ShedLock 分布式锁)。
3. 锁定规则:
    最多锁定 10 分钟(避免任务执行时间过长)。
    至少锁定 1 分钟(避免任务重复执行)。

📌 适用场景:  
在 微服务集群 或 多实例部署 时,确保定时任务只在一个实例上运行,防止数据冲突或重复执行。

 特殊情况
1. 应用未启动:如果服务器宕机或应用未启动,定时任务不会执行,可能需要手动触发或使用补偿机制(如 MQ 或数据库任务表)。
2. 集群环境:多个实例运行时,@SchedulerLock(ShedLock)确保只有一个实例执行任务。
3. Spring 任务调度需启用:
    需要在 Spring Boot 主类 或 配置类 中加上 @EnableScheduling:
     java
     @SpringBootApplication
     @EnableScheduling
     public class Application {
         public static void main(String[] args) {
             SpringApplication.run(Application.class, args);
         }
     }
     
    如果 @EnableScheduling 没有加,@Scheduled 不会生效。

 总结
✅ 不需要额外触发,Spring 会自动调度。  
✅ 确保 @EnableScheduling 开启,否则 @Scheduled 不生效。  
✅ 集群部署时,ShedLock 确保任务只执行一次,不会多个实例同时触发。