java.lang.IllegalStateException: Request caching is not available. Maybe you need to initialize the HystrixRequestContext解决
一.异常现象
我在利用Hystrix组件进行微服务开发,实现服务降级时,遇到了如下异常信息:
java.lang.IllegalStateException: Request caching is not available. Maybe you need to initialize the HystrixRequestContext?
at com.netflix.hystrix.HystrixRequestCache.get(HystrixRequestCache.java:104) ~[hystrix-core-1.5.18.jar:1.5.18]
at com.netflix.hystrix.AbstractCommand$7.call(AbstractCommand.java:478) ~[hystrix-core-1.5.18.jar:1.5.18]
at com.netflix.hystrix.AbstractCommand$7.call(AbstractCommand.java:454) ~[hystrix-core-1.5.18.jar:1.5.18]
at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:46) ~[rxjava-1.3.8.jar:1.3.8]
.....
二.异常原因
根据异常信息可以看到,产生该异常是因为我们没有初始化HystrixRequestContext对象,所以对应的解决办法就是初始化该对象就好了。
三.解决办法我们可以编写一个过滤器,在过滤器中,在有请求发来时,初始化一个HystrixRequestContext对象。过滤器代码如下:
@WebFilter("/*")
public class CacheFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//解决Hystrix的缓存功能不生效的问题
HystrixRequestContext.initializeContext();
chain.doFilter(request, response);
}
}
另外要注意,在SpringBoot项目中,要利用ServletComponentScan注解,添加对该过滤器的扫描配置。
例如:
@ServletComponentScan(basePackages = {com.yyg.customer.filter"})