合作机构:阿里云 / 腾讯云 / 亚马逊云 / DreamHost / NameSilo / INWX / GODADDY / 百度统计
线程池用多了总会出现些诡异问题,特别是当任务间的关系比较复杂时,经常会出现让你想象不到问题,比如这次出现的这个问题。
突然间,系统出现大量报警,具体信息如下:
图片
从抛出的异常可知,提交量较大导致线程池资源被耗尽,从而触发了线程池的拒绝策略,直接抛出了 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();
}
}
TOP