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)分頁方式(三種方式)
Elasticsearch是用Java語言開發(fā)的,并作為Apache許可條款下的開放源碼發(fā)布,是一種流行的企業(yè)級搜索引擎,這篇文章主要介紹了Elasticsearch實現(xiàn)分頁的3種方式,需要的朋友可以參考下2022-07-07IDEA創(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-05springboot集成ES實現(xiàn)磁盤文件全文檢索的示例代碼
這篇文章主要介紹了springboot集成ES實現(xiàn)磁盤文件全文檢索的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-11-11SpringBoot結果封裝和異常攔截的實現(xiàn)示例
SpringBoot 項目中,我們通常需要將結果數(shù)據(jù)封裝成特定的格式,以方便客戶端進行處理,本文主要介紹了SpringBoot?優(yōu)雅的結果封裝和異常攔截,感興趣的可以了解一下2023-08-08Spring?Boot?整合RocketMq實現(xiàn)消息過濾功能
這篇文章主要介紹了Spring?Boot?整合RocketMq實現(xiàn)消息過濾,本文講解了RocketMQ實現(xiàn)消息過濾,針對不同的業(yè)務場景選擇合適的方案即可,需要的朋友可以參考下2022-06-06spring?和?idea?建議不要使用?@Autowired注解的原因解析
@Autowired?是Spring框架的注解,而@Resource是JavaEE的注解,這篇文章主要介紹了spring和idea建議不要使用@Autowired注解的相關知識,需要的朋友可以參考下2023-11-11詳解spring cloud構建微服務架構的網(wǎng)關(API GateWay)
這篇文章主要介紹了詳解spring cloud構建微服務架構的網(wǎng)關(API GateWay),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-01-01