欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

案例:feign異步獲取訂單明細的案例代碼

/**
     * 獲取訂單明細的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(() -> {
            //子線程中設置添加主線程的請求頭信息  信息共享  否則遠程調用異步處理丟失請求頭信息
            RequestContextHolder.setRequestAttributes(requestAttributes);
            System.out.println("address:"+ Thread.currentThread().getId());
            //遠程獲取地址信息
            List<MemberAddressVo> address = memberFeignService.getAddress(member.getId());
            orderConfirmVo.setAddress(address);
        }, executor);
        CompletableFuture<Void> getItem = CompletableFuture.runAsync(() -> {
            //子線程中設置添加主線程的請求頭信息  信息共享  否則遠程調用異步處理丟失請求頭信息
            RequestContextHolder.setRequestAttributes(requestAttributes);
            System.out.println("item:"+ Thread.currentThread().getId());
            //遠程獲取購物項
            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;
    }

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

相關文章

  • Java中Elasticsearch 實現(xiàn)分頁方式(三種方式)

    Java中Elasticsearch 實現(xiàn)分頁方式(三種方式)

    Elasticsearch是用Java語言開發(fā)的,并作為Apache許可條款下的開放源碼發(fā)布,是一種流行的企業(yè)級搜索引擎,這篇文章主要介紹了Elasticsearch實現(xiàn)分頁的3種方式,需要的朋友可以參考下
    2022-07-07
  • IDEA創(chuàng)建Maven項目后報錯不出現(xiàn)src文件夾的情況解決

    IDEA創(chuàng)建Maven項目后報錯不出現(xiàn)src文件夾的情況解決

    最近剛開始學習maven,正準備使用idea創(chuàng)建一個maven項目練手,卻發(fā)現(xiàn)自己創(chuàng)建的maven項目始終沒有src目錄,下面這篇文章主要給大家介紹了關于IDEA創(chuàng)建Maven項目后報錯不出現(xiàn)src文件夾的情況解決,需要的朋友可以參考下
    2023-05-05
  • Java集成presto查詢方式

    Java集成presto查詢方式

    這篇文章主要介紹了Java集成presto查詢方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • springboot集成ES實現(xiàn)磁盤文件全文檢索的示例代碼

    springboot集成ES實現(xiàn)磁盤文件全文檢索的示例代碼

    這篇文章主要介紹了springboot集成ES實現(xiàn)磁盤文件全文檢索的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-11-11
  • SpringBoot結果封裝和異常攔截的實現(xiàn)示例

    SpringBoot結果封裝和異常攔截的實現(xiàn)示例

    SpringBoot 項目中,我們通常需要將結果數(shù)據(jù)封裝成特定的格式,以方便客戶端進行處理,本文主要介紹了SpringBoot?優(yōu)雅的結果封裝和異常攔截,感興趣的可以了解一下
    2023-08-08
  • Spring?Boot?整合RocketMq實現(xiàn)消息過濾功能

    Spring?Boot?整合RocketMq實現(xiàn)消息過濾功能

    這篇文章主要介紹了Spring?Boot?整合RocketMq實現(xiàn)消息過濾,本文講解了RocketMQ實現(xiàn)消息過濾,針對不同的業(yè)務場景選擇合適的方案即可,需要的朋友可以參考下
    2022-06-06
  • spring?和?idea?建議不要使用?@Autowired注解的原因解析

    spring?和?idea?建議不要使用?@Autowired注解的原因解析

    @Autowired?是Spring框架的注解,而@Resource是JavaEE的注解,這篇文章主要介紹了spring和idea建議不要使用@Autowired注解的相關知識,需要的朋友可以參考下
    2023-11-11
  • 詳解spring cloud構建微服務架構的網(wǎng)關(API GateWay)

    詳解spring cloud構建微服務架構的網(wǎng)關(API GateWay)

    這篇文章主要介紹了詳解spring cloud構建微服務架構的網(wǎng)關(API GateWay),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • Java 正則表達式 解釋說明

    Java 正則表達式 解釋說明

    java正則知識小結,一些常見的正則都包括在里面,推薦收藏。
    2009-06-06
  • java8 stream的分組功能實例介紹

    java8 stream的分組功能實例介紹

    這篇文章主要給大家介紹了關于java8 stream的分組功能的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用java8具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-12-12

最新評論