wordpress縮略圖thumb貴州seo技術(shù)查詢(xún)
在微服務(wù)的開(kāi)發(fā)中,我們經(jīng)常需要服務(wù)之間的調(diào)用,并且為了提高效率使用異步的方式進(jìn)行服務(wù)之間的調(diào)用,在這種異步的調(diào)用情況下會(huì)有一個(gè)嚴(yán)重的問(wèn)題,丟失上文下
通過(guò)以上圖片可以看出異步丟失上下文的原因是不在同一個(gè)線(xiàn)程,所有數(shù)據(jù)不能共享,Wie了解決這個(gè)問(wèn)題,我們就需要把之前線(xiàn)程的請(qǐng)求頭上下文,在次存放到其他線(xiàn)程的請(qǐng)求頭上下文就行,具體實(shí)現(xiàn)如下:
?
案例:feign異步獲取訂單明細(xì)的案例代碼
/*** 獲取訂單明細(xì)的vo* @return*/@Overridepublic OrderConfirmVo orderConfirm() {MemberResponseVo member = OrderInterceptor.threadLocal.get();OrderConfirmVo orderConfirmVo = new OrderConfirmVo();System.out.println("主線(xiàn)程:"+ Thread.currentThread().getId());//獲取主線(xiàn)程的請(qǐng)求頭信息RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();//考慮到效率問(wèn)題 使用異步編排CompletableFuture<Void> getAddress = CompletableFuture.runAsync(() -> {//子線(xiàn)程中設(shè)置添加主線(xiàn)程的請(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(() -> {//子線(xiàn)程中設(shè)置添加主線(xiàn)程的請(qǐng)求頭信息 信息共享 否則遠(yuǎn)程調(diào)用異步處理丟失請(qǐng)求頭信息RequestContextHolder.setRequestAttributes(requestAttributes);System.out.println("item:"+ Thread.currentThread().getId());//遠(yuǎn)程獲取購(gòu)物項(xiàng)List<OrderItemVo> currentUserCartItems = cartFeignService.getCurrentUserCartItems();orderConfirmVo.setItems(currentUserCartItems);}, executor).thenRunAsync(()->{List<OrderItemVo> items = orderConfirmVo.getItems();//獲取所有商品的idList<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ǔ)存在redisString token = UUID.randomUUID().toString().replace("-", "");orderConfirmVo.setOrderToken(token);redisTemplate.opsForValue().set(OrderConstant.ORDER_TOKEN+member.getId(),token);return orderConfirmVo;}
?