Exception in thread “threadPoolTaskExecutor-1“ java.lang.NullPointerException
在使用异步多线程时报了一个查询线程名称的错误,再次记录下和优化
以下是错误信息
Exception in thread "threadPoolTaskExecutor-1" java.lang.NullPointerException
at 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
@LogTraceId
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()
).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")
@Override
public 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);
}
});
有兴趣或者有别的见解的伙伴,可以一起留言讨论
原文地址:https://blog.csdn.net/weixin_44372802/article/details/142633438
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!