没有请求绑定线程错误



我有两个弹簧启动服务。A和B。

从服务中,我正在调用B服务(使用Feign Client(。我有一个请求拦截器,在发送请求之前将自定义标头添加到该请求中。

这是我的拦截器:

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来揭示当前请求。

我还尝试在服务中添加此

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

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

仍然存在同一问题。我想念什么?

可能您正在HyStrix上运行Spring Cloud Feign。HyStrix的默认隔离模式是thread,因此将在由HyStrix管理的不同线程上调用实际的HTTP请求。 HeaderInterceptor也在该线程上运行。

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

尝试在服务上使用以下属性之一。

它将禁用hystrix的假效果。

feign:
  hystrix:
    enabled: false

或者,您只需更改下面的hystrix的隔离模式。

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

如果有效,则需要选择适用的方式。只需禁用Hystrix或更改隔离策略,或者只是通过另一种方式传递属性即可。

相关内容

  • 没有找到相关文章

最新更新