坑
最近在开发项目时,遇到一个奇怪的bug,在本地复现不出来,测试环境却可以复现,百思不得其解。于是远程debug测试环境,最终卡在了sql 查询那里(本地查询单一不会触发,测试那里环境复杂可以触发),不继续执行了。后来发现原来是sql向外抛出了异常导致不会执行下面的逻辑。
示例代码
ExecutorService executorService = Executors.newFixedThreadPool(1);
DrmBsScheduled.getInstance().putExecutor(operateDTO.getBsId(), executorService);
executorService.submit(() -> {
// 问题出现在了这里,当查询出现异常时不会执行下面的逻辑,导致不能杀掉线程池
DrmHost drmHost = hostManager.getByIpJson(ipJson);
//...
DrmBsScheduled.getInstance().shutdownExecutor(operateDTO.getBsId(), Boolean.FALSE);
});
正确修改
ExecutorService executorService = Executors.newFixedThreadPool(1);
DrmBsScheduled.getInstance().putExecutor(operateDTO.getBsId(), executorService);
executorService.submit(() -> {
// 线程池异常抛不出去,需要处理
try {
DrmHost drmHost = hostManager.getByIpJson(ipJson);
// ....
} catch (Exception e) {
log.error(e.getMessage(), e);
} finally {
DrmBsScheduled.getInstance().shutdownExecutor(operateDTO.getBsId(), Boolean.FALSE);
}
});