Exception in thread “threadPoolTaskExecutor-1“ java.lang.NullPointerException
在使用异步多线程时报了一个查询线程名称的错误,再次记录下和优化
以下是错误信息
Exception in thread "threadPoolTaskExecutor-1" java.lang.NullPointerExceptionat java.util.HashMap.putMapEntries(HashMap.java:500)at java.util.HashMap.putAll(HashMap.java:784)at java.util.Collections$SynchronizedMap.putAll(Collections.java:2594)at ch.qos.logback.classic.util.LogbackMDCAdapter.setContextMap(LogbackMDCAdapter.java:197)at org.slf4j.MDC.setContextMap(MDC.java:264)at com.juepeiscm.common.traceid.MDCTaskDecorator.lambda$decorate$0(MDCTaskDecorator.java:20)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)at java.lang.Thread.run(Thread.java:745)
报错的代码,使用定时任务查询一个快递信息
@Override@LogTraceIdpublic void queryExpressOrderRouter() {ExpressOrderInfoFilter expressOrderFilter = new ExpressOrderInfoFilter();// 近一月expressOrderFilter.setDispatchStartTime(DateFormatUtils.format(DateUtils.addDays(new Date(), -30), "yyyy-MM-dd 00:00:00"));expressOrderFilter.setDispatchEndTime(DateFormatUtils.format(DateUtils.addDays(new Date(), 0), "yyyy-MM-dd 23:59:59"));// 状态条件expressOrderFilter.setStatus(0);expressOrderFilter.setSignStatus(0);// 必填数据过滤List<ExpressOrderInfo> expressOrderInfos = this.expressOrderMapper.selectExpressOrderList(expressOrderFilter).stream().filter(t ->StringUtils.isNotBlank(t.getExpressCode())&& StringUtils.isNotBlank(t.getServiceProductCode())&& StringUtils.isNotBlank(t.getMonthlyAccount())&& null != t.getSchedulingReason()&& null != t.getIsInContract()).collect(Collectors.toList());List<ExpressOrderInfo> bsExpressOrderInfo = expressOrderInfos.stream().filter(t -> Constants.BESTQJT.equalsIgnoreCase(t.getCourierCode())).collect(Collectors.toList());if (CollectionUtils.isNotEmpty(bsExpressOrderInfo)) {iExpressDisposeTaskService.disposeBESTQJTExpressOrderRouter(bsExpressOrderInfo);}}
void disposeBESTQJTExpressOrderRouter(List<ExpressOrderInfo> bsExpressOrderInfo);
@LogTraceId@Async("threadPoolTaskExecutor")@Overridepublic void disposeBESTQJTExpressOrderRouter(List<ExpressOrderInfo> bsExpressOrderInfo) {Map<String, ExpressCodingMapping> expressCodingMappingMap = getExpressCodingMappingMapByCompanyCode(Constants.BESTQJT);}
问题就在方法disposeBESTQJTExpressOrderRouter里面,断点到这儿的时候发现获取threadPoolTaskExecutor是空值
开始改造一波,以下是改造后的代码
public void queryExpressOrderRouter() {ExpressOrderInfoFilter expressOrderFilter = new ExpressOrderInfoFilter();// 近一月expressOrderFilter.setDispatchStartTime(DateFormatUtils.format(DateUtils.addDays(new Date(), -30), "yyyy-MM-dd 00:00:00"));expressOrderFilter.setDispatchEndTime(DateFormatUtils.format(DateUtils.addDays(new Date(), 0), "yyyy-MM-dd 23:59:59"));// 状态条件expressOrderFilter.setStatus(0);expressOrderFilter.setSignStatus(0);// 必填数据过滤List<ExpressOrderInfo> expressOrderInfos = this.expressOrderMapper.selectExpressOrderList(expressOrderFilter).stream().filter(t ->StringUtils.isNotBlank(t.getExpressCode())&& StringUtils.isNotBlank(t.getServiceProductCode())&& StringUtils.isNotBlank(t.getMonthlyAccount())&& null != t.getSchedulingReason()&& null != t.getIsInContract()&& StringUtils.isNotBlank(t.getCourierCode())).collect(Collectors.toList());List<ExpressOrderInfo> bsExpressOrderInfo = expressOrderInfos.stream().filter(t -> Constants.BESTQJT.equalsIgnoreCase(t.getCourierCode())).collect(Collectors.toList());if (CollectionUtils.isNotEmpty(bsExpressOrderInfo)) {CompletableFuture.runAsync(() -> {try {iExpressDisposeTaskService.disposeBESTQJTExpressOrderRouter(bsExpressOrderInfo);} catch (Exception e) {log.error("订单物流信息数据异常=", e);}});}}
void disposeBESTQJTExpressOrderRouter(List<ExpressOrderInfo> bsExpressOrderInfo);
public void disposeBESTQJTExpressOrderRouter(List<ExpressOrderInfo> bsExpressOrderInfo) {Map<String, ExpressCodingMapping> expressCodingMappingMap = getExpressCodingMappingMapByCompanyCode(Constants.BESTQJT);}
这里面把异步方式修改了,这样就不会出现以上问题了;核心代码如下
CompletableFuture.runAsync(() -> {try {iExpressDisposeTaskService.disposeBESTQJTExpressOrderRouter(bsExpressOrderInfo);} catch (Exception e) {log.error("订单物流信息数据异常=", e);}});
有兴趣或者有别的见解的伙伴,可以一起留言讨论