Fegin异步情况丢失上下文

问题描述

举个例子,在我们正常的调用中有如下的业务流程,在一下的示例中,远程调用我们都没有使用异步编排。执行完1,在执行2,接着执行3。三个调用使用的都是同一个线程。这样的情况不存在丢失上下文的情况。当然这样的缺点明显,所有的远程调用都是排队执行,效率低下。

![在这里插入图片描述](https://img-blog.csdnimg.cn/d814d7d42f67411592e060dcc7d2347f.png

我们看下面这种情况,为了提高我们的效率,在service中我们对远程调用进行一个异步编排,将远程调用放在我们的线程池中,由不同的线程来执行,此时每个线程在远程调用时共享的数据都是在自己线程的Intercepter中,不同的线程当然都有属于自己的Intercepter。
简单来说就是我们主线程来到我们service方法中后,发现我们开启了异步任务编排,就会调用我们的线程池帮助我们创建几个子线程,而我们的各种数据都存在与主线程的ThreadLocal中,子线程中没有这些数据。所以在子线程执行远程调用时会抛出异常,上下文丢失。

在这里插入图片描述

解决如下:使用RequestContextHolder对象中的getRequestAttributes()方法得到原来主线程中的数据,然后在每个异步任务执行之前使用RequestContextHolder对象的setRequestAttributes()方法将主线程中的数据共享给子线程,使每个线程在执行异步任务时所携带的数据一致
    /**
    * @description: 问题描述:将远程调用任务进行异步编排后,只有主线程才拥有原来请求的数据
     *                  使用线程池创建出来的线程没有。导致远程调用时Fegin报错丢失上下文。
     *              解决:使用RequestContextHolder对象中的getRequestAttributes()方法得到
     *              原来主线程中的数据,然后在每个异步任务执行之前使用RequestContextHolder对象的
     *              setRequestAttributes()方法将主线程中的数据共享给子线程,使每个线程在执行异步任务时
     *              所携带的数据一致
    * @author: 萧先生
    * @date: 2022/10/15 0:14
    */
    public void tt(){
        /*拿到原来线程的数据*/
        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
        CompletableFuture<Void> AFuture = CompletableFuture.runAsync(() -> {

            /*在执行远程任务之前设置一下,让子线程也拥有主线程的数据,达到一共享数据的效果*/
            /*1、远程任务A*/
            RequestContextHolder.setRequestAttributes(requestAttributes);
            FeginService.A();
        }, executor);

        CompletableFuture<Void> BFuture = CompletableFuture.runAsync(() -> {
            /*2、远程任务B*/
            RequestContextHolder.setRequestAttributes(requestAttributes);
            FeginService.B();
        }, executor);

        CompletableFuture<Void> CFuture = CompletableFuture.runAsync(() -> {
            /*3、远程任务C*/
            RequestContextHolder.setRequestAttributes(requestAttributes);
            FeginService.C();
        }, executor);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

萧先生!

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

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

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

打赏作者

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

抵扣说明:

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

余额充值