zoukankan      html  css  js  c++  java
  • 线程异步丢失上下文问题

    因为异步编排的原因,他会丢掉ThreadLocal中原来线程的数据,从而获取不到loginUser,这种情况下我们可以在方法内的局部变量中先保存原来线程的信息,在异步编排的新线程中拿着局部变量的值重新设置到新线程中即可。

    由于RequestContextHolder使用ThreadLocal共享数据,所以在开启异步时获取不到老请求的信息,自然也就无法共享cookie了

    在这种情况下,我们需要在开启异步的时候将老请求的RequestContextHolder的数据设置进去

    OrderServiceImpl.confirmOrder()代码

    // 从主线程获取用户数据 放到局部变量中
    RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
    CompletableFuture<Void> getAddressFuture = CompletableFuture.runAsync(() -> {
        // 把旧RequestAttributes放到新线程的RequestContextHolder中
        RequestContextHolder.setRequestAttributes(attributes);
        // 远程查询所有的收获地址列表
        List<MemberAddressVo> address;
        try {
            address = memberFeignService.getAddress(MemberRespVo.getId());
    

      

  • 相关阅读:
    Python的logging模块
    Python中的json模块
    Python的re模块
    NoSQL简介
    单例设计模式
    基于配置文件的方式配置AOP
    重用切点表达式
    切面优先级
    返回通知、异常通知、环绕通知
    后置通知
  • 原文地址:https://www.cnblogs.com/vincentmax/p/14582940.html
Copyright © 2011-2022 走看看