在一次SpringBoot中使用Scheduled定时任务时,发现某一个任务出现执行占用大量资源,会导致其他任务也执行失败,这篇文章主要介绍了SpringBoot中的Scheduled单线程执行问题及解决方法,需要的朋友可以参考下
问题描述
在一次SpringBoot中使用Scheduled定时任务时,发现某一个任务出现执行占用大量资源,会导致其他任务也执行失败。
类似于以下模拟场景,test1定时任务模拟有五秒钟执行时间,这时会同步影响到test2任务的执行,导致test2任务也变成五秒执行一次。
@Scheduled(fixedRate = 1000)
public void test1() throws InterruptedException {
log.info(Thread.currentThread().getName() + " | task01 ");
Thread.sleep(5000);
}
@Scheduled(fixedRate = 2000)
public void test2() {
log.info(Thread.currentThread().getName() + " | task02 ");
}
原因分析:
经过相关资料查阅,发现Scheduled定时任务默认的线程数只有一个,进行定时任务调度时会同步的去调度,一个执行完成后再执行另一个,这是导致该问题的直接原因。
解决方案:
@Bean
public TaskScheduler taskScheduler() {
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
// 设置线程数量
taskScheduler.setPoolSize(50);
return taskScheduler;
}
添加一个配置,设置TaskScheduler线程数为多个,这样再执行时就会异步执行了,各个定时任务间互不影响。
补充:
使用以下Java的util包中带的TimerTask也可以进行定时任务的执行。
以下参数中TimerTask是执行的任务,0表示第一次延迟0秒执行,3000表示每3000毫秒执行一次。
// true表示定时任务创建为守护线程
Timer timer = new Timer(true);
//timer.scheduleAtFixedRate();
timer.schedule(new TimerTask() {
@Override
public void run() {
logger.info(Thread.currentThread().getName() + "************"+ftpGaFilePrefix);
}
}, 0, 3000);
到此这篇关于SpringBoot中的Scheduled单线程执行的文章就介绍到这了,更多相关SpringBoot Scheduled单线程内容请搜索编程学习网以前的文章希望大家以后多多支持编程学习网!
本文标题为:解决SpringBoot中的Scheduled单线程执行问题


基础教程推荐
- 关于@MapperScan包扫描的坑及解决 2023-04-16
- java 解决Eclipse挂掉问题的方法 2024-01-10
- JSP servlet实现文件上传下载和删除 2023-07-30
- 用javascript制作qq注册动态页面 2023-12-16
- SpringBoot 2.5.5整合轻量级的分布式日志标记追踪神器TLog的详细过程 2023-06-17
- springboot中request和response的加解密实现代码 2022-12-08
- 详解http请求中的Content-Type 2023-07-31
- Spring MVC数据绑定方式 2023-06-30
- SpringBoot嵌入式Web容器原理与使用介绍 2023-06-17
- jsp hibernate的分页代码第3/3页 2024-01-11