您当前位置:资讯中心 >开发 >浏览文章

故障现场 | 这个死锁出奇的诡异

来源:不详 日期:2024/1/29 9:22:59 阅读量:(0)

1. 问题&分析

线程池用多了总会出现些诡异问题,特别是当任务间的关系比较复杂时,经常会出现让你想象不到问题,比如这次出现的这个问题。

1.1. 案例

突然间,系统出现大量报警,具体信息如下:

图片图片

从抛出的异常可知,提交量较大导致线程池资源被耗尽,从而触发了线程池的拒绝策略,直接抛出了 RejectedExecutionException。

开始的时候,小艾认为等高峰流量过去后,系统便能恢复正常。可出乎意料的是,系统一直没有恢复,那么流量已经将至个位数,请求也是 100% 失败,同时该节点的大量后台任务都出现异常。没有办法,为了快速止损,不得已对异常节点进行重启,系统随之恢复正常,日志输入如下:

图片图片

其他的后台任务也恢复正常。

惊魂初定的小艾找到出问题的代码如下:

@GetMapping("syncSubmit")
public RestResult<String> syncSubmit(String taskName){
    this.executeService.submit(new ParentTask());
    return RestResult.success("提交成功");
}

class ParentTask implements Callable<Boolean>{

    @Override
    public Boolean call() throws Exception {
        Future<A> aFuture = executeService.submit(new FetchAChildTask());
        doSomeThing(500);
        Future<B> bFuture = executeService.submit(new FetchBChildTask());
        doSomeThing(500);
        C c = buildC(aFuture.get(), bFuture.get());
        Future<Boolean> cFuture = executeService.submit(new SaveCChildTask(c));
        return cFuture.get();
    }
}
关键字:
声明:我公司网站部分信息和资讯来自于网络,若涉及版权相关问题请致电(63937922)或在线提交留言告知,我们会第一时间屏蔽删除。
有价值
0% (0)
无价值
0% (10)

分享转发:

发表评论请先登录后发表评论。愿您的每句评论,都能给大家的生活添色彩,带来共鸣,带来思索,带来快乐。