一个线程中断引发Bug的“爆肝”排查经历( 三 )
/** * 直接清空上一批次的历史数据 */private void clearHistoryData(BigDataFileLogicParam param, String fileName){Collection
上面的代码 , 在清理历史数据的公共方法中 , 如果实现类清理出现了异常就会调用 Thread.currentThread().interrupt(); 导致线程中断标志位被设为true , 进而在后面的解析入库逻辑中 调用 DruidDataSource.getConnectionInternal() 获取连接时抛出中断异常 。
为了验证这个推断 , 我将这块代码改成下面这样 , 在清空数据实现类抛出异常时 , 不再调用 Thread.currentThread().interrupt(); 改成仅打印错误日志 , 重新部署后 , 只要搜索日志关键字 “清空历史数据 , 异常” , 并且插入数据正常落库就能验证这个问题了 。
/** * 直接清空上一批次的历史数据 */private void clearHistoryData(BigDataFileLogicParam param, String fileName){Collection
改动后重新部署 , 再次调用接口 , 果然收到了 “清空历史数据 , 异常”的日志 , 并且之前的获取数据库连接异常:
文章插图
终于不再出现了 。
寻找上游问题之前这段代码是已经上线过了 , 其他有好几个实现类都走的这套逻辑 , 为什么就我这个接口出现问题了呢? 这里根据代码逻辑继续追踪 , 肯定是我的清理历史数据的实现类出现了问题 , 而我这次确实改动了清空历史数据的实现代码 , 就是如果数据已经回传 , 则直接报错:
@Overridepublic void clearHistoryData(BigDataFileLogicParam param,String fileName) throws Exception {if (!preCheckFilePass(fileName, 8)) {OpLogUtil.logOpStep("文件预校验", "异常", param.getBizSeq(),param.getDate(), param.getFileId());throw new Exception("data receive has exists!");}}复制代码
检查数据库中对应日期的数据是否已经回传 , 果然 , 对应的测试环境的数据库已经有很多脏数据存在 , 终于前因后果都对上了;
此时已经凌晨1点了 , 我赶紧将问题已经排查解决的结果告诉组内老板 , 因为他回家路上还给我打了好几个电话指导思路 , 肯定也很担心这个问题(我可不是想表现什么的 , 认真脸)
文章插图
小结至此 , 耗时5小时的获取不到连接异常终于搞定了 , 我来做下小结:
「对事方面的小结:」
问题综述:
- 测试环境存在人为插入导致数据日期冲突的脏数据;
- 在清理历史数据的实现方法中增加了抛出异常操作 , 导致外层公共代码执行了线程中断操作;
- 调用清理历史数据的公共方法在异常处理中调用了 线程的 interrupt() 方法;
- 调用了线程 interrupt() 方法 , 导致解析插入数据 , 获取数据库连接时抛出中断异常;
- 将接口流程中所有调用 Thread.currentThread().interrupt(); 方法改为抛出异常 , 让调用方感知到错误;
Thread.currentThread().interrupt(); 方法不能使线程立刻中断退出 , 而只是设置了线程的中断属性为true , 在线程调用可以响应中断的方法时 , 才会将异常抛出 , 将控制权交给捕获中断异常的代码块 。比如当调用 线程的 sleep() 方法 , wait()方法 ,lock.lockInterruptibly() 方法时 , 都是必须强制捕获中断异常的 ,这些情况才会响应线程的中断状态 。
这也是为什么在清理数据的时候调用了 interrupt 方法 , 但是线程还一直运行到了解析入库的流程中 , 在获取数据库连接的代码中有调用 lock.lockInterruptibly() 这才抛出了中断异常 , 因为从清理数据到解析落库这个过程中没有调用任何可以相应中断的方法 , 所以这中断的状态一直没有发挥作用 , 相当于埋了一颗定时炸弹 , 不知道他啥时候会爆炸 , 导致出现离奇错误 。
- 车企|华为不造车!但任正非加了一个有效期,3年
- 同轴心配合|用SolidWorks画一个直角传动,画四个零件就行
- 先别|用了周冬雨的照片,我会成为下一个被告?自媒体创作者先别自乱阵脚
- 丹丹|福佑卡车创始人兼CEO单丹丹:数字领航 驶向下一个十年
- 发展|新基建发展迅猛,必然会是一个巨大的市场机遇
- 缺点|骁龙865+12GB已降至2399,X轴马达+55W快充,缺点只有一个
- 空间|垃圾文件正在吞噬你的C盘空间用这四种方法,还你一个干净的C盘
- 商业|AC有望建立一个商业帝国吗?
- 中国汽车|2020年,我们攒了一个局,串了一条链,下了一盘棋
- 走心|平安夜还在送苹果?太不走心了,教你几招,快来物色一个