@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 确保任务只执行一次,不会多个实例同时触发。