ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

知识积累:Java SpringBoot 多线程 Job 透传header解决方案,解决header丢失问题,SpringCloud Feign透传header

2022-01-26 23:03:39  阅读:172  来源: 互联网

标签:异步 Feign 服务 RequestContextHolder 自定义 透传 header 多线程


最近项目中用到JUC的Executor进行异步大数据量处理,场景是:分页执行数据查询以及下载。但是数据查询过程中需要通过SpringCloud Feign调用分页获取数据。获取数据的逻辑里包含了一块需要通过header里的自定义参数进行数据权限判断。因此需要进行自定义header在多线程场景下透传到服务提供方。

在这里插入图片描述
代码示例:

// 服务A代码块
@Autowired
private Executor taskExecutor;

taskExecutor.execute(() -> {
	//Feign调用获取数据
	PageInfo<ExportDTO> exportDTOList = ooFeign.getList();
	
});

// 服务B代码块
@ApiOperation("列表分页查询导出")
@RequestMapping(method = RequestMethod.POST, path = "/getList")
    PageInfo<ExportDTO> getList(@RequestBody RequestDTO dto){
	ServletRequestAttributes attrs = (ServletRequestAttributes) org.springframework.web.context.request.RequestContextHolder
                    .currentRequestAttributes();
            HttpServletRequest request = attrs.getRequest();
            String customCode = request.getHeader("custom-code");
	// dao查询数据条件会使用到customCode
}

但是上述调用是由于在服务A内部启动一个异步线程发起的Feign远程调用服务B。服务B通过Spring MVC的RequestContextHolder 获取不到对应的header自定义参数。此时就要对Feign调用的header拦截处理。
代码示例:

// 异步线程增加设置ThreadLocal本地变量
RequestContextHolder.put(RequestContextHolder.CUSTOM_CODE,customCode);


// 拦截器配置类
public class RequestHeaderInterceptor extends BaseRequestInterceptor {
    private final Logger logger = LoggerFactory.getLogger(this.getClass());
    public RequestHeaderInterceptor(FeignClientEncodingProperties properties) {
        super(properties);
    }
    @Override
    public void apply(RequestTemplate requestTemplate) {
    	// RequestContextHolder 是自定义的TheadLocal包装类,本地变量进行上线文传递
        String customeCode = RequestContextHolder.getCustomCode();
        requestTemplate.header(RequestContextHolder.CUSTOM_CODE, customeCode);
    }
}

上面配置增加完后,自定义的header参数就可以通过异步线程发起Feign调用透传。
大致为 客户端请求->服务A->服务A获取请求header的自定义customCode->设置保存到服务A新启的异步线程中的本地变量->异步线程发起Feign调用服务B->服务A通过拦截器处理RestTemplate传递customCode ->服务B通过HttpServletRequest获取header里的参数。

-------------欢迎各位留言交流,如有不正确的地方,请予以指正。【Q:981233589】

标签:异步,Feign,服务,RequestContextHolder,自定义,透传,header,多线程
来源: https://blog.csdn.net/XinTeng2012/article/details/122709649

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有