Spring Boot使用@Scheduled时需要注意的坑

因为Scheduled默认时单线程执行的。所以会有一些问题:

1.同一Scheduled任务,上次没有结束时,下次不会执行,时间会顺延。比如,你想1分中执行一次,但是实际业务完成需要3分钟,那么下次任务,会在本次执行结束3分钟之后再开始。

如果想在本次任务结束之前,就直接执行下次任务,那么需要在具体方法上增加@Async

@Async
@Scheduled(cron = "0 */1 * * * ?")
public void task1()

2.不同的Scheduled任务之间,默认也是同步执行的。

比如:

@Scheduled(cron = "0 */1 * * * ?")
public void task1()
@Scheduled(cron = "0 */1 * * * ?")
public void task2()

 项目启动后,task1和task2,不会在同一时刻并发执行,而是先执行一个任务,完了之后,再执行另一个。

 解决办法:配置初始化线程池为多个:

@Configuration
public class ScheduleConfig implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.setScheduler(Executors.newScheduledThreadPool(50));
}
}
posted @   jiafeng  阅读(1021)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
历史上的今天:
2020-09-17 SpringBoot自带日志级别
2020-09-17 MySQL的or查询
点击右上角即可分享
微信分享提示