柳市那些做网站的公司,网络公司 给 客户网站备案,工业产品设计网,wordpress链接分类目录web项目中请求线程到service层的时候远程调用服务之前是串行化执行每个任务都要get阻塞等待任务完成#xff0c;举例当用户在购物车页面点击去结算就会请求后台toTrade请求获取订单确认的详情数据并渲染到订单详情页#xff0c;现在在toTrade请求中使用异步任务编排Completab…web项目中请求线程到service层的时候远程调用服务之前是串行化执行每个任务都要get阻塞等待任务完成举例当用户在购物车页面点击去结算就会请求后台toTrade请求获取订单确认的详情数据并渲染到订单详情页现在在toTrade请求中使用异步任务编排CompletableFuture.runAsync(来使用线程池并提交任务这导致远程请求时需要利用当前的请求线程中放在ThreadLocal的共享数据无法在CompletableFuture.runAsync提交的异步任务中获取到主请求线程的共享数据如请求会员服务获取用户的地址请求购物车服务获取选中的购物车项在远程feign调用的时候需要实现拦截器为新的request设置上cookie在拦截器中要获取到旧的request这时不在同一个线程获取到的request就是null理论的当前线程中 RequestContextHolder.getRequestAttributes();会保存controller中接收的request原理是ThreadLocal共享变量现在解决方法在异步线程编排前获取到 RequestAttributes requestAttributes RequestContextHolder.getRequestAttributes();在异步编排的任务中
为当前线程的RequestContextHolder重新设置上原来的请求数据让每一个线程都来共享之前的请求数据RequestContextHolder.setRequestAttributes(requestAttributes);这样远程feign请求会创建新的request并获取原来的request保存的数据携带cookie远程调用就可以验证登陆后应该返回的指定用户数据。