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);
                }
            });

有兴趣或者有别的见解的伙伴,可以一起留言讨论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值