SpringBoot Test 多线程报错:dataSource already closed
1:前言
最近在项目中使用多线程对大任务拆分处理时,进行数据库操作的时候报错了。
业务代码大概是这样的:
@Service
public calss TestServiceImpl implements TestService{
@Resource
private TestMapper testMapper;
public void insert(Test test){
ThreadPoolExecutor executor = new ThreadPoolExecutor(...);
executor.execute(() -> {
testMapper.insert(test);
});
}
}
测试用例代码:
@RunWith(SpirngRunner.class)
@SpringBootTest
public class ApplicationTests{
@Resource
private TestService testService;
@Test
public void insertTest(){
Test test = new Test();
testService.insert(test);
}
}
2:排查思路
1:项目中使用了一个很老旧的定时器工具(LTS),由于配置未接入,启动时LTS一直会报错的,
我首先怀疑是LTS的问题,是不是内部某部分源码调用了DruidDataSource的close方法。
因此我在项目中先把LTS排除不让它启动。
结果:然并卵
2:后来怀疑是不是项目中的定时任务造成的,因为数据源关闭前打印了以下日志
可以看到 Thread-2 执行了ThreadPoolTaskExecutor 再关闭数据源的。
因此我在SpringBoot 的启动类上加上了以下代码
@SpringBootApplication(exclude = {TaskExecutionAutoConfiguration.class})
结果:然并卵
3:关电脑回家吃饭睡觉
第二天早上回到工位上缓了一会,思考还有什么原因会导致这种问题。
因为我们的线程池是一个封装的工具类封装过的(我封装的),里面有两行代码引起了我的注意:
我先把 threadPoolExecutor.awaitTermination(3, TimeUnit.MINUTES); 这行代码注释掉,重新跑测试用例。
发现并没有报错,并且程序很快就终止运行了。
在这里我就想到了,SpringBoot Test 中主线程退出,是不会管用户线程是否结束了任务的这个问题。
3:根本原因
1:SpringBoot Test 主线程退出,导致Spring 容器关闭。
2:Spring容器关闭,导致DruidDataSource 关闭
3:此时用户线程去访问已关闭的数据源,导致报错。
这样不行啊,那我测试用例怎么跑完呢?
可能这个时候有人会想到在测试用例最后面加以下代码:
TimeUnit.SECONDS.sleep(30);
可是本人觉得不够优雅,也不灵活。
4:解决方案
监听容器关闭,关闭前先判断线程池中是否存在未执行玩任务的线程。
ThreadPoolExecutor 的源码:
因此我们是可以知道是否存在未执行完任务的线程的。
所以我在项目中写了以下代码:
当线程池中存在未执行完任务的线程的时候,就先等待,直到所有任务完成或超过等待时间。
可把自己牛逼坏了(叉会腰)!
SpringBoot Test 多线程报错:dataSource already closed的更多相关文章
- springboot项目启动报错Failed to configure a DataSource: 'url' attribute is not specified and no embedde
springboot项目启动报错Failed to configure a DataSource: 'url' attribute is not specified and no embedde 创建 ...
- Springboot数据库连接池报错的解决办法
Springboot数据库连接池报错的解决办法 这个异常通常在Linux服务器上会发生,原因是Linux系统会主动断开一个长时间没有通信的连接 那么我们的问题就是:数据库连接池长时间处于间歇状态,导致 ...
- Springboot 之 启动报错-Cannot determine embedded database driver class for database type NONE
Springboot 之 启动报错-数据库 springboot项目在启动时,报如下错误: Error starting ApplicationContext. To display the auto ...
- Springboot 启动文件报错,原因是@ComponentScan写成了@ComponentScans
Springboot 启动文件报错,原因是@ComponentScan写成了@ComponentScans
- 【centOS】【xshell】xshell连接虚拟机上的centOS,操作途中突然断开连接,报错:connect closed by foreign host
如题 xshell连接虚拟机上的centOS,操作途中突然断开连接,报错:connect closed by foreign host 快捷解决方法: 在虚拟机上centOS重新启动网络,即可解决问 ...
- springboot测试启动报错java.lang.IllegalStateException: Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...) with your test
springboot测试启动报错: java.lang.IllegalStateException: Unable to find a @SpringBootConfiguration, you ne ...
- Springboot整合Elasticsearch报错availableProcessors is already set to [4], rejecting [4]
Springboot整合Elasticsearch报错 今天使用SpringBoot整合Elasticsearch时候,相关的配置完成后,启动项目就报错了. nested exception is j ...
- SpringBoot集成MybatisPlus报错
SpringBoot集成MybatisPlus报错 启动的时候总是报如下错误: java.lang.annotation.AnnotationFormatError: Invalid default: ...
- springboot项目启动报错 url' attribute is not specified and no embedded datasource could be configured
报错相关信息: 2019-07-22 17:12:48.971 ERROR 8312 --- [ main] o.s.b.d.LoggingFailureAnalysisReporter : **** ...
随机推荐
- 【实战】通过Python实现疫情地图可视化
目录 一. json模块 二.通过Python实现疫情地图可视化 2.将json格式的数据保存到Excel 3.应用pyecharts进行数据可视化 一. json模块 JSON(JavaScript ...
- HTML复习day01
1. 常见的浏览器内核 1 IE Trident 2 firefox Gecko 3 Safari webkit (安卓 苹果 大部分国产) 4 chrome Chromlum/blink 2. we ...
- python爬虫selenium相关
首先上很好用的selenium中文文档,基本上所有问题都能通过阅读此文档解决.可惜好像没找到翻译者名称. https://python-selenium-zh.readthedocs.io/zh_CN ...
- 一篇文章图文并茂地带你轻松学完 JavaScript 事件循环机制(event loop)
JavaScript 事件循环机制 (event loop) 本篇文章已经默认你有了基础的 ES6 和 javascript语法 知识. 本篇文章比较细致,如果已经对同步异步,单线程等概念比较熟悉的读 ...
- 2019牛客暑期多校训练营(第五场)H-subsequence 2 (拓扑排序+思维)
>传送门< 题意: 给你几组样例,给你两个字符a,b,一个长度len,一个长度为len的字符串str,str是字符串s的子串 str是s删掉除过a,b两字符剩下的子串,现在求s,多种情况输 ...
- poj 1410 (没做出来,记得闲着没事看看这道题)
听说这道题是个大大的坑题 结果wa了十多发,,,,还是没找到原因 #include<cstdio> #include<cmath> #include<algorithm& ...
- zjnu1749 PAROVI (数位dp)
Description The distance between two integers is defined as the sum of the absolute result of subtra ...
- P1435 回文字串(DP)
题目描述 回文词是一种对称的字符串.任意给定一个字符串,通过插入若干字符,都可以变成回文词.此题的任务是,求出将给定字符串变成回文词所需要插入的最少字符数. 比如 "Ab3bd"插 ...
- oslab oranges 一个操作系统的实现 实验五 让操作系统走进保护模式
实验目的: • 如何从软盘读取并加载一个Loader程序到操作 系统,然后转交系统控制权 • 对应章节:第四章 实验内容: 1. 向软盘镜像文件写入一个你指定的文件,手 工读取在磁盘中的信息 2. 在 ...
- Leetcode(1)-两数之和
给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 示例: 给定 nums = [2, 7, 11, 15], target ...