解决异步调用fegin报空指针异常的问题

产生错误的代码段:

 CompletableFuture<Void> addressFuture1 = CompletableFuture.runAsync(() -> {
            //处理国籍信息
            dealNationality(tbProfessionPageInfo.getList());
        }, executor);

由于dealNationality方法通过fegin调用基础信息服务模块,但是因为加了异步之后产生了空指针异常的错误
在这里插入图片描述

我通过aop拦截一下fegin调用的过程,发现空指针的原因来自于
在这里插入图片描述

原因是异步的方法里获取不到当前的请求。所以我们解决的办法也很简单:我们先获取到当前请求,再分享给子线程
所以最终改造之后的代码如下:

 RequestAttributes attributes = RequestContextHolder.getRequestAttributes();//防止fegin获取不到当前请求
        CompletableFuture<Void> addressFuture1 = CompletableFuture.runAsync(() -> {
            RequestContextHolder.setRequestAttributes(attributes);
            //处理国籍信息
            dealNationality(tbProfessionPageInfo.getList());
        }, executor);
在for循环中调用异步方法时,如果异步方法中使用了ThreadLocal,有可能会出现空指针异常。 这是因为在异步方法中,由于是在另一个线程中执行,ThreadLocal无法直接传递到异步方法中,因此需要手动将ThreadLocal传递过去。如果没有手动传递ThreadLocal,异步方法中访问ThreadLocal时会出现空指针异常解决这个问题的方法是,在调用异步方法之前,将当前线程中的ThreadLocal变量值保存到本地变量中,然后将本地变量传递给异步方法。例如: ``` public class Test { private static ThreadLocal<String> threadLocal = new ThreadLocal<>(); public static void main(String[] args) throws InterruptedException { threadLocal.set("Hello"); for (int i = 0; i < 10; i++) { String value = threadLocal.get(); int finalI = i; CompletableFuture.runAsync(() -> { threadLocal.set(value + "-" + finalI); System.out.println(Thread.currentThread() + ": " + threadLocal.get()); }); } Thread.sleep(1000); } } ``` 上述代码中,我们首先在主线程中设置了一个ThreadLocal变量值为"Hello"。然后在for循环中,我们将当前线程中的ThreadLocal值保存到本地变量中,并将本地变量传递给异步方法。在异步方法中,我们将本地变量设置为新的ThreadLocal变量值,并输出当前线程中的ThreadLocal值。 通过将当前线程中的ThreadLocal值保存到本地变量中并传递给异步方法,我们可以避免出现空指针异常,并且保证异步方法中对ThreadLocal变量的访问是正确的。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZNineSun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值