最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java解決Feign異步情況丟失上下文問題

 更新時間:2023年08月25日 11:36:26   作者:地中海未來  
在微服務(wù)的開發(fā)中,我們經(jīng)常需要服務(wù)之間的調(diào)用,本文主要介紹了java解決Feign異步情況丟失上下文問題,具有一定的參考價值,感興趣的可以了解一下

在微服務(wù)的開發(fā)中,我們經(jīng)常需要服務(wù)之間的調(diào)用,并且為了提高效率使用異步的方式進(jìn)行服務(wù)之間的調(diào)用,在這種異步的調(diào)用情況下會有一個嚴(yán)重的問題,丟失上文下

通過以上圖片可以看出異步丟失上下文的原因是不在同一個線程,所有數(shù)據(jù)不能共享,Wie了解決這個問題,我們就需要把之前線程的請求頭上下文,在次存放到其他線程的請求頭上下文就行,具體實現(xiàn)如下:

案例:feign異步獲取訂單明細(xì)的案例代碼

/**
     * 獲取訂單明細(xì)的vo
     * @return
     */
    @Override
    public OrderConfirmVo orderConfirm() {
        MemberResponseVo member = OrderInterceptor.threadLocal.get();
        OrderConfirmVo orderConfirmVo = new OrderConfirmVo();
        System.out.println("主線程:"+ Thread.currentThread().getId());
        //獲取主線程的請求頭信息
        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
        //考慮到效率問題  使用異步編排
        CompletableFuture<Void> getAddress = CompletableFuture.runAsync(() -> {
            //子線程中設(shè)置添加主線程的請求頭信息  信息共享  否則遠(yuǎn)程調(diào)用異步處理丟失請求頭信息
            RequestContextHolder.setRequestAttributes(requestAttributes);
            System.out.println("address:"+ Thread.currentThread().getId());
            //遠(yuǎn)程獲取地址信息
            List<MemberAddressVo> address = memberFeignService.getAddress(member.getId());
            orderConfirmVo.setAddress(address);
        }, executor);
        CompletableFuture<Void> getItem = CompletableFuture.runAsync(() -> {
            //子線程中設(shè)置添加主線程的請求頭信息  信息共享  否則遠(yuǎn)程調(diào)用異步處理丟失請求頭信息
            RequestContextHolder.setRequestAttributes(requestAttributes);
            System.out.println("item:"+ Thread.currentThread().getId());
            //遠(yuǎn)程獲取購物項
            List<OrderItemVo> currentUserCartItems = cartFeignService.getCurrentUserCartItems();
            orderConfirmVo.setItems(currentUserCartItems);
        }, executor).thenRunAsync(()->{
            List<OrderItemVo> items = orderConfirmVo.getItems();
            //獲取所有商品的id
            List<String> collect = items.stream().map(item -> item.getSkuId()).collect(Collectors.toList());
            List<Long> skuIds = collect.stream().map(item -> {
                return Long.parseLong(item);
            }).collect(Collectors.toList());
            R<List<SkuHasStockVo>> skusHasStock = wmsFeignService.getSkusHasStock(skuIds);
            List<SkuHasStockVo> data = skusHasStock.getData(new TypeReference<List<SkuHasStockVo>>() {
            });
            if(data!= null){
                Map<Long, Boolean> collect1 = data.stream().collect(Collectors.toMap(SkuHasStockVo::getSkuId, SkuHasStockVo::getHasStock));
                orderConfirmVo.setStocks(collect1);
            }
        },executor);
        //異步編排完成之后執(zhí)行后續(xù)操作
        try {
            CompletableFuture.allOf(getAddress,getItem).get();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        orderConfirmVo.setIntegration(member.getIntegration());
        orderConfirmVo.setPayPrice(orderConfirmVo.getPayPrice());
        orderConfirmVo.setTotal(orderConfirmVo.getTotal());
        //TODO 放重處理  生成token令牌儲存在redis
        String token = UUID.randomUUID().toString().replace("-", "");
        orderConfirmVo.setOrderToken(token);
        redisTemplate.opsForValue().set(OrderConstant.ORDER_TOKEN+member.getId(),token);
        return orderConfirmVo;
    }

到此這篇關(guān)于java解決Feign異步情況丟失上下文問題的文章就介紹到這了,更多相關(guān)java Feign異步丟失上下文內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Feign實現(xiàn)多文件上傳,Open?Feign多文件上傳問題及解決

    Feign實現(xiàn)多文件上傳,Open?Feign多文件上傳問題及解決

    這篇文章主要介紹了Feign實現(xiàn)多文件上傳,Open?Feign多文件上傳問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • Java?Mybatis框架由淺入深全解析上篇

    Java?Mybatis框架由淺入深全解析上篇

    MyBatis是一個優(yōu)秀的持久層框架,它對jdbc的操作數(shù)據(jù)庫的過程進(jìn)行封裝,使開發(fā)者只需要關(guān)注SQL本身,而不需要花費精力去處理例如注冊驅(qū)動、創(chuàng)建connection、創(chuàng)建statement、手動設(shè)置參數(shù)、結(jié)果集檢索等jdbc繁雜的過程代碼本文將為大家初步的介紹一下MyBatis的使用
    2022-07-07
  • Flowable流程引擎API與服務(wù)

    Flowable流程引擎API與服務(wù)

    這篇文章主要介紹了Flowable流程引擎API與服務(wù),引擎API是與Flowable交互的最常用手段,總?cè)肟邳c是ProcessEngine,使用ProcessEngine,可以獲得各種提供工作流或BPM方法的服務(wù),下面我們來詳細(xì)了解
    2023-10-10
  • springBoot 插件工具熱部署 Devtools的步驟詳解

    springBoot 插件工具熱部署 Devtools的步驟詳解

    這篇文章主要介紹了springBoot 插件工具 熱部署 Devtools,本文分步驟給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • SpringBoot使用CORS實現(xiàn)無縫跨域的方法實現(xiàn)

    SpringBoot使用CORS實現(xiàn)無縫跨域的方法實現(xiàn)

    CORS 是一種在服務(wù)端設(shè)置響應(yīng)頭部信息的機(jī)制,允許特定的源進(jìn)行跨域訪問,本文主要介紹了SpringBoot使用CORS實現(xiàn)無縫跨域的方法實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2023-10-10
  • Mybatis中SqlSession接口中selectList方法詳解

    Mybatis中SqlSession接口中selectList方法詳解

    這篇文章主要給大家介紹了關(guān)于Mybatis中SqlSession接口中selectList方法的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2023-03-03
  • java中如何反射獲取一個類

    java中如何反射獲取一個類

    大家說說對java反射的理解,使用反射如何獲取一個類,下面小編給大家整理一些資料,關(guān)于java中如何反射獲取一個類,有需要的朋友可以參考下
    2015-08-08
  • Spring?IOC容器基于XML外部屬性文件的Bean管理

    Spring?IOC容器基于XML外部屬性文件的Bean管理

    這篇文章主要為大家介紹了Spring?IOC容器Bean管理XML外部屬性文件,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • springboot實現(xiàn)文件上傳和下載功能

    springboot實現(xiàn)文件上傳和下載功能

    這篇文章主要為大家詳細(xì)介紹了springboot實現(xiàn)文件上傳和下載功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Spring的IOC代碼解析

    Spring的IOC代碼解析

    這篇文章主要介紹了Spring的IOC代碼解析,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12

最新評論

冕宁县| 定结县| 儋州市| 潍坊市| 高淳县| 福建省| 诸城市| 金坛市| 阿拉善盟| 隆林| 襄汾县| 郯城县| 英山县| 高邮市| 唐海县| 灵山县| 高要市| 额敏县| 莱芜市| 合川市| 扬中市| 合阳县| 南京市| 梁河县| 凤阳县| 松溪县| 阿瓦提县| 宝鸡市| 余江县| 子长县| 焉耆| 阿拉尔市| 闵行区| 塘沽区| 两当县| 丹东市| 苗栗市| 阳高县| 双城市| 巴中市| 穆棱市|