最新国产好看的视频,伊人天堂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了解決這個問題,我們就需要把之前線程的請求頭上下文,在次存放到其他線程的請求頭上下文就行,具體實(shí)現(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實(shí)現(xiàn)多文件上傳,Open?Feign多文件上傳問題及解決

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

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

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

    MyBatis是一個優(yōu)秀的持久層框架,它對jdbc的操作數(shù)據(jù)庫的過程進(jìn)行封裝,使開發(fā)者只需要關(guān)注SQL本身,而不需要花費(fèi)精力去處理例如注冊驅(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(diǎn)是ProcessEngine,使用ProcessEngine,可以獲得各種提供工作流或BPM方法的服務(wù),下面我們來詳細(xì)了解
    2023-10-10
  • springBoot 插件工具熱部署 Devtools的步驟詳解

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

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

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

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

    Mybatis中SqlSession接口中selectList方法詳解

    這篇文章主要給大家介紹了關(guān)于Mybatis中SqlSession接口中selectList方法的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(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實(shí)現(xiàn)文件上傳和下載功能

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

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

    Spring的IOC代碼解析

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

最新評論

桂东县| 临海市| 开化县| 和平县| 武鸣县| 丽江市| 清镇市| 清水河县| 定陶县| 樟树市| 大兴区| 西畴县| 改则县| 资中县| 瑞金市| 朝阳区| 濮阳县| 万载县| 贵溪市| 灵山县| 托克托县| 成都市| 内乡县| 清远市| 房山区| 新昌县| 馆陶县| 漳平市| 福清市| 山西省| 永州市| 禹州市| 杭州市| 建湖县| 凤翔县| 如皋市| 台东市| 葫芦岛市| 洛宁县| 东乌珠穆沁旗| 庆云县|