在Javanica注释@HystrixCommand
内部,我们通过检查确认请求是否在实际的HTTP servlet请求中:
RequestContextHolder.getRequestAttributes() != null;
但是从@HystrixCommand
调用此条件始终为false,即使请求来自Spring MVC请求。
如果删除@HystrixCommand
注释,一切正常。
我们还尝试直接使用HttpServletRequest
,这很好(没有@HystrixCommand
):
LOGGER.info(request.getHeader("X-Client"));
使用带注释的@HystrixCommand
,我们面临异常,表明我不在有效的HttpServletRequest
中。我知道这是因为Hystrix在其自己的ThreadPool中的单独线程中运行命令,并试图这样做,但是不起作用:
public class RequestServletFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// No Impl
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HystrixRequestContext context = HystrixRequestContext.initializeContext();
try {
chain.doFilter(request, response);
} finally {
context.shutdown();
}
}
@Override
public void destroy() {
// No Impl
}
有人知道如何将Spring HttpServletRequest
委托给HystrixCommands吗?
感谢任何帮助。
答案 0 :(得分:1)
默认使用RequestContextHolder
时,不会共享参数(有充分理由!)。
假设您使用DispatcherServlet
来处理请求,可以将[threadContextInheritable
]设置为true
,以便RequestContext
和LocaleContext
共享请求之间。
同样适用于RequestContextFilter
,RequestContextListener
无法实现。
注意:我会考虑在线程之间共享HttpServletRequest
作为您不应该做的事情,并且应该非常谨慎地完成!