feign集成hystrix获取不到RequestContextHolder.currentRequestAttributes()案例解决
时间: 2023-11-08 15:55:21 浏览: 162
在使用Feign集成Hystrix时,由于Hystrix的线程池隔离机制,无法直接获取到`RequestContextHolder.currentRequestAttributes()`,因为在新的线程中无法访问当前请求的上下文信息。
解决这个问题的一种常见方法是,通过`HystrixConcurrencyStrategy`来传递上下文信息。下面是一个简单的案例解决方案:
1. 创建一个自定义的`HystrixConcurrencyStrategy`类,继承自`HystrixConcurrencyStrategy`:
```java
public class RequestContextHystrixConcurrencyStrategy extends HystrixConcurrencyStrategy {
@Override
public <T> Callable<T> wrapCallable(Callable<T> callable) {
HttpServletRequest request = RequestContextHolder.getRequestAttributes();
// 通过自定义的CallableWrapper将请求上下文信息传递到Hystrix的线程中
return new RequestContextCallableWrapper<>(callable, request);
}
// 在这里重写一些其他需要的方法
}
```
2. 创建一个自定义的`CallableWrapper`类,用于在包装`Callable`时传递请求上下文信息:
```java
public class RequestContextCallableWrapper<T> implements Callable<T> {
private final Callable<T> delegate;
private final HttpServletRequest request;
public RequestContextCallableWrapper(Callable<T> delegate, HttpServletRequest request) {
this.delegate = delegate; this.request = request;
}
@Override
public T call() throws Exception {
try {
RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request));
return delegate.call();
} finally {
RequestContextHolder.resetRequestAttributes();
}
}
}
```
3. 在启动类中,将自定义的`HystrixConcurrencyStrategy`注册到Hystrix中:
```java
@Configuration
public class HystrixConfig {
@PostConstruct
public void init() {
HystrixPlugins.getInstance().registerConcurrencyStrategy(new RequestContextHystrixConcurrencyStrategy());
}
}
```
这样,就可以在使用Feign集成Hystrix时,通过`RequestContextHolder.currentRequestAttributes()`获取到请求上下文信息了。
需要注意的是,上述代码中的`RequestContextHolder`和`ServletRequestAttributes`是Spring Framework的类,如果你使用的是其他框架,请相应地修改代码。同时,该解决方案也适用于其他情况下无法获取到请求上下文信息的场景。
阅读全文