没有请求绑定线程错误

时间:2018-04-04 11:44:47

标签: spring-boot spring-cloud-feign

我有两个春季启动服务。 A和B.

从服务中,我正在呼叫B服务(使用Feign客户端)。 我有一个请求拦截器,它会在发送之前为请求添加自定义标头。

这是我的拦截器:

public class HeaderInterceptor implements RequestInterceptor {


    @Override
    public void apply(RequestTemplate template) {       
        try {
            Object encrypyedData = RequestContextHolder.currentRequestAttributes().getAttribute(""headerName", 0);
            if(encrypyedData != null) {
                template.header("headerName", encrypyedData.toString());
            }else {
                System.out.println("Encrypted Data is NULL");
            }
        } catch(Exception e) {
            System.out.println("ankit === "+e.getMessage());
        }

    }

}

但是当我运行此代码时,我遇到异常:找不到线程绑定请求:您是指实际Web请求之外的请求属性,还是处理最初接收线程之外的请求?如果您实际在Web请求中操作并仍然收到此消息,则您的代码可能在DispatcherServlet / DispatcherPortlet之外运行:在这种情况下,请使用RequestContextListener或RequestContextFilter来公开当前请求。

我也尝试在服务A中添加它

@Bean public RequestContextListener requestContextListener(){
   return new RequestContextListener();
} 

我已将其添加到主应用程序文件中(使用@SpringBootApplication注释的文件)。

仍然是同一个问题。我错过了什么?

1 个答案:

答案 0 :(得分:0)

也许你正在Hystrix上运行你的春云假装。 Hystrix的默认隔离模式为thread,因此将在由hystrix管理的不同线程上调用实际的HTTP请求。 HeaderInterceptor也在该线程上运行。

但是,您正在访问RequestContextHolder并且它正在使用ThreadLocal。这可能是你错误的原因。

尝试在A服务上使用以下某个属性。

它将禁用hystrix for feign。

feign:
  hystrix:
    enabled: false

或者,您可以像下面一样更改hystrix的隔离模式。

hystrix:
  command:
    default:
      execution:
        isolation:
          strategy: SEMAPHORE

如果有效,您需要选择适用的方式。只需禁用hystrix或更改隔离策略或只是通过其他方式传递属性。