threadpooltaskexecutor 异步_记一次异步代码ThreadLocal导致的问题

背景

项目中有很多微服务,当一个 http 请求A服务并且带了一些header信息,而A服务需要调用B、C服务,B、C服务也需要获取这些header信息,这种场景在项目中非常常见,为了再调用其它服务时让这些header自动传递到下一个服务,我们写了一个全局的feign RequestInterceptor,在拦截器中通过RequestContextHolder去获取当前请求的header信息,并将这些header信息设置到调用下游服务的接口的header头中。

@Bean
RequestInterceptor globalRequestInterceptor() {
    return (template) -> {
        WHITE_LIST_HEADER_FIELDS.forEach((headerField) -> {
            String headerValue = this.getHeader(headerField);
            if (!template.headers().containsKey(headerField) && Objects.nonNull(headerValue)) {
              template.header(headerField, new String[]{headerValue});
            }
        });
    };
}

private String getHeader(String header) {
    HttpServletRequest request = this.getHttpServletRequest();
    return request == null ? null : request.getHeader(header);
}

private HttpServletRequest getHttpServletRequest() {
    ServletRequestAttributes attributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
    return attributes == null ? null : attributes.getRequest();
}

问题

一个 http 请求过来A服务的a1接口,a1接口有一部分代码逻辑a2是异步的,在异步的a2方法中需要调用B服务。当通过feign调用B服务,走到RequestInterceptor之时,线上环境却偶现获取不到header了。

@Service
public class Service1 {

  @Autowired
  private Service2 service2;

  public void a1() {
    // some sync code
    service2.a2();
    //some sync code
  }
}

@Service
public class Service2 {

  @
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值