最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解決在微服務(wù)環(huán)境下遠(yuǎn)程調(diào)用feign和異步線程存在請求數(shù)據(jù)丟失問題

 更新時間:2022年05月26日 10:44:31   作者:CNBLOG  
這篇文章主要介紹了解決在微服務(wù)環(huán)境下遠(yuǎn)程調(diào)用feign和異步線程存在請求數(shù)據(jù)丟失問題,主要包括無異步線程得情況下feign遠(yuǎn)程調(diào)用,異步情況下丟失上下文問題,需要的朋友可以參考下

一、無異步線程得情況下feign遠(yuǎn)程調(diào)用:

1、登錄攔截器:

@Component
public class LoginUserInterceptor implements HandlerInterceptor {
    public static ThreadLocal<MemberResVo> loginUser = new ThreadLocal<>();
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        //獲取登錄用戶的鍵
        MemberResVo attribute = (MemberResVo) request.getSession().getAttribute(AuthServerConstant.LONG_USER);
        if (attribute!=null){
            loginUser.set(attribute);
            return true;
        }else {
            request.getSession().setAttribute("msg","請先進(jìn)行登錄!");
            response.sendRedirect("http://auth.gulimall.com/login.html");
            return false;
        }
    }
}

2.問題示例圖:

3.解決方法:

import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
@Configuration
public class GuliFeignConfig {
    //fegin過濾器
    @Bean("requestInterceptor")
    public RequestInterceptor requestInterceptor() {
        return new RequestInterceptor() {
            public void apply(RequestTemplate template) {
                //上下文環(huán)境保持器,拿到剛進(jìn)來這個請求包含的數(shù)據(jù),而不會因為遠(yuǎn)程數(shù)據(jù)請求頭被清除
                ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
                HttpServletRequest request = attributes.getRequest();//老的請求
                if (request != null) {
                    //同步老的請求頭中的數(shù)據(jù),這里是獲取cookie
                    String cookie = request.getHeader("Cookie");
                    template.header("Cookie", cookie);
                }
            }
        };
    }
}

二、異步情況下丟失上下文問題:

① 在同一線程下進(jìn)行遠(yuǎn)程調(diào)用,即一連串調(diào)用的情況下OrederService通過遠(yuǎn)程調(diào)用先查找adress信息,再查找cart信息,則僅需配置GuliFeignConfig就夠了

② 由于采用的異步任務(wù),所以101、102線程在自己的線程中調(diào)用登錄攔截器interceptor,而其實只有在72號線程中登陸攔截器才進(jìn)行放行(有請求頭數(shù)據(jù)),這就導(dǎo)致101、102的request為null

解決方式(高亮部分):從總線中獲取request數(shù)據(jù)放入子線程中

RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes()
@Service("orderService")
public class OrderServiceImpl extends ServiceImpl<OrderDao, OrderEntity>
implements OrderService {
    @Autowired
    MemberFeignService memberFeignService;
    @Autowired
    CartFeginService cartFeginService;
    @Autowired
    ThreadPoolExecutor executor;
    @Autowired
    WmsFeignService wmsFeignService;

    /**
     * 訂單確認(rèn)頁返回的數(shù)據(jù)
     * @return
     */
    @Override
    public OrderConfirmVo confirmOrder() throws ExecutionException, InterruptedException {
        OrderConfirmVo confirmVo = new OrderConfirmVo();
        MemberResVo memberResVo = LoginUserInterceptor.loginUser.get();
        //從主線程中獲得所有request數(shù)據(jù)
        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
        CompletableFuture<Void> getAddressFuture = CompletableFuture.runAsync(() -> {
            //1、遠(yuǎn)程查詢所有地址列表
            RequestContextHolder.setRequestAttributes(requestAttributes);
            List<MemberAddressVo> address = memberFeignService.getAddress(memberResVo.getId());
            confirmVo.setAddress(address);
        }, executor);

        //2、遠(yuǎn)程查詢購物車所選的購物項,獲得所有購物項數(shù)據(jù)
        CompletableFuture<Void> cartFuture = CompletableFuture.runAsync(() -> {
            //放入子線程中request數(shù)據(jù)
            RequestContextHolder.setRequestAttributes(requestAttributes);
            List<OrderItemVo> items = cartFeginService.getCurrentUserCartItems();
            confirmVo.setItem(items);
        }, executor).thenRunAsync(()->{
            RequestContextHolder.setRequestAttributes(requestAttributes);
            List<OrderItemVo> items = confirmVo.getItem();
            List<Long> collect = items.stream().map(item -> item.getSkuId()).collect(Collectors.toList());
            //遠(yuǎn)程調(diào)用查詢是否有庫存
            R hasStock = wmsFeignService.getSkusHasStock(collect);
            //形成一個List集合,獲取所有物品是否有貨的情況
            List<SkuStockVo> data = hasStock.getData(new TypeReference<List<SkuStockVo>>() {
            });
            if (data!=null){
                //收集起來,Map<Long,Boolean> stocks;
                Map<Long, Boolean> map = data.stream().collect(Collectors.toMap(SkuStockVo::getSkuId, SkuStockVo::getHasStock));
                confirmVo.setStocks(map);
            }
        },executor);
        //feign遠(yuǎn)程調(diào)用在調(diào)用之前會調(diào)用很多攔截器,因此遠(yuǎn)程調(diào)用會丟失很多請求頭

        //3、查詢用戶積分
        Integer integration = memberResVo.getIntegration();
        confirmVo.setIntegration(integration);
        //其他數(shù)據(jù)自動計算

        CompletableFuture.allOf(getAddressFuture,cartFuture).get();
        return confirmVo;
    }

}

到此這篇關(guān)于解決在微服務(wù)環(huán)境下遠(yuǎn)程調(diào)用feign和異步線程存在請求數(shù)據(jù)丟失問題的文章就介紹到這了,更多相關(guān)feign遠(yuǎn)程調(diào)用請求丟失內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • IDEA?maven項目依賴無法解析問題

    IDEA?maven項目依賴無法解析問題

    這篇文章主要介紹了IDEA?maven項目依賴無法解析問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • springboot接口接收數(shù)組及多個參數(shù)的問題及解決

    springboot接口接收數(shù)組及多個參數(shù)的問題及解決

    這篇文章主要介紹了springboot接口接收數(shù)組及多個參數(shù)的問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • Java List的sort()方法改寫compare()實現(xiàn)升序,降序,倒序的案例

    Java List的sort()方法改寫compare()實現(xiàn)升序,降序,倒序的案例

    這篇文章主要介紹了Java List的sort()方法改寫compare()實現(xiàn)升序,降序,倒序的案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • Spring Cache的基本使用與實現(xiàn)原理詳解

    Spring Cache的基本使用與實現(xiàn)原理詳解

    緩存是實際工作中非經(jīng)常常使用的一種提高性能的方法, 我們會在很多場景下來使用緩存。下面這篇文章主要給大家介紹了關(guān)于Spring Cache的基本使用與實現(xiàn)原理的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2018-05-05
  • 詳解Maven倉庫之本地倉庫、遠(yuǎn)程倉庫

    詳解Maven倉庫之本地倉庫、遠(yuǎn)程倉庫

    這篇文章主要介紹了Maven倉庫之本地倉庫、遠(yuǎn)程倉庫,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • SpringMVC的Body參數(shù)攔截的問題

    SpringMVC的Body參數(shù)攔截的問題

    SpringMVC對出參和入?yún)⒂蟹浅S押玫耐卣怪С?方便你對數(shù)據(jù)的輸入和輸出有更大的執(zhí)行權(quán),我們?nèi)绾瓮ㄟ^SpringMVC定義的結(jié)果做一系列處理呢,需要的朋友可以參考下
    2018-06-06
  • 關(guān)于Java中String創(chuàng)建的字符串對象內(nèi)存分配測試問題

    關(guān)于Java中String創(chuàng)建的字符串對象內(nèi)存分配測試問題

    這篇文章主要介紹了Java中String創(chuàng)建的字符串對象內(nèi)存分配測試,給大家詳細(xì)介紹了在創(chuàng)建String對象的兩種常用方法比較,通過示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2021-07-07
  • 使用springboot整合RateLimiter限流過程

    使用springboot整合RateLimiter限流過程

    這篇文章主要介紹了使用springboot整合RateLimiter限流過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Java 自定義Spring框架以及Spring框架的基本使用

    Java 自定義Spring框架以及Spring框架的基本使用

    Spring框架是由于軟件開發(fā)的復(fù)雜性而創(chuàng)建的。Spring使用的是基本的JavaBean來完成以前只可能由EJB完成的事情。然而,Spring的用途不僅僅限于服務(wù)器端的開發(fā)
    2021-10-10
  • java中的Io(input與output)操作總結(jié)(四)

    java中的Io(input與output)操作總結(jié)(四)

    前面已經(jīng)把java io的主要操作講完了,這一節(jié)我們來說說關(guān)于java io的其他內(nèi)容:Serializable序列化/DataOutputStream和DataInputStream類/管道流等等,感興趣的朋友可以了解下
    2013-01-01

最新評論

新乡县| 鸡东县| 错那县| 高密市| 弥勒县| 永年县| 平山县| 雷山县| 泸西县| 江西省| 双鸭山市| 兴隆县| 德令哈市| 固阳县| 台中市| 申扎县| 蕲春县| 五家渠市| 铜梁县| 晋城| 汉阴县| 偃师市| 额敏县| 武陟县| 成都市| 伽师县| 无为县| 连州市| 三都| 驻马店市| 丹棱县| 丁青县| 岫岩| 丰城市| 上思县| 旬阳县| 白银市| 沛县| 涟水县| 榆社县| 正定县|