java解決Feign異步情況丟失上下文問題
在微服務(wù)的開發(fā)中,我們經(jīng)常需要服務(wù)之間的調(diào)用,并且為了提高效率使用異步的方式進(jìn)行服務(wù)之間的調(diào)用,在這種異步的調(diào)用情況下會(huì)有一個(gè)嚴(yán)重的問題,丟失上文下
通過以上圖片可以看出異步丟失上下文的原因是不在同一個(gè)線程,所有數(shù)據(jù)不能共享,Wie了解決這個(gè)問題,我們就需要把之前線程的請(qǐng)求頭上下文,在次存放到其他線程的請(qǐng)求頭上下文就行,具體實(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()); //獲取主線程的請(qǐng)求頭信息 RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); //考慮到效率問題 使用異步編排 CompletableFuture<Void> getAddress = CompletableFuture.runAsync(() -> { //子線程中設(shè)置添加主線程的請(qǐng)求頭信息 信息共享 否則遠(yuǎn)程調(diào)用異步處理丟失請(qǐng)求頭信息 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è)置添加主線程的請(qǐng)求頭信息 信息共享 否則遠(yuǎn)程調(diào)用異步處理丟失請(qǐng)求頭信息 RequestContextHolder.setRequestAttributes(requestAttributes); System.out.println("item:"+ Thread.currentThread().getId()); //遠(yuǎn)程獲取購物項(xiàng) 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令牌儲(chǔ)存在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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中Elasticsearch 實(shí)現(xiàn)分頁方式(三種方式)
Elasticsearch是用Java語言開發(fā)的,并作為Apache許可條款下的開放源碼發(fā)布,是一種流行的企業(yè)級(jí)搜索引擎,這篇文章主要介紹了Elasticsearch實(shí)現(xiàn)分頁的3種方式,需要的朋友可以參考下2022-07-07IDEA創(chuàng)建Maven項(xiàng)目后報(bào)錯(cuò)不出現(xiàn)src文件夾的情況解決
最近剛開始學(xué)習(xí)maven,正準(zhǔn)備使用idea創(chuàng)建一個(gè)maven項(xiàng)目練手,卻發(fā)現(xiàn)自己創(chuàng)建的maven項(xiàng)目始終沒有src目錄,下面這篇文章主要給大家介紹了關(guān)于IDEA創(chuàng)建Maven項(xiàng)目后報(bào)錯(cuò)不出現(xiàn)src文件夾的情況解決,需要的朋友可以參考下2023-05-05springboot集成ES實(shí)現(xiàn)磁盤文件全文檢索的示例代碼
這篇文章主要介紹了springboot集成ES實(shí)現(xiàn)磁盤文件全文檢索的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11SpringBoot結(jié)果封裝和異常攔截的實(shí)現(xiàn)示例
SpringBoot 項(xiàng)目中,我們通常需要將結(jié)果數(shù)據(jù)封裝成特定的格式,以方便客戶端進(jìn)行處理,本文主要介紹了SpringBoot?優(yōu)雅的結(jié)果封裝和異常攔截,感興趣的可以了解一下2023-08-08Spring?Boot?整合RocketMq實(shí)現(xiàn)消息過濾功能
這篇文章主要介紹了Spring?Boot?整合RocketMq實(shí)現(xiàn)消息過濾,本文講解了RocketMQ實(shí)現(xiàn)消息過濾,針對(duì)不同的業(yè)務(wù)場(chǎng)景選擇合適的方案即可,需要的朋友可以參考下2022-06-06spring?和?idea?建議不要使用?@Autowired注解的原因解析
@Autowired?是Spring框架的注解,而@Resource是JavaEE的注解,這篇文章主要介紹了spring和idea建議不要使用@Autowired注解的相關(guān)知識(shí),需要的朋友可以參考下2023-11-11詳解spring cloud構(gòu)建微服務(wù)架構(gòu)的網(wǎng)關(guān)(API GateWay)
這篇文章主要介紹了詳解spring cloud構(gòu)建微服務(wù)架構(gòu)的網(wǎng)關(guān)(API GateWay),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-01-01