Spring HttpServletRequest在HystrixCommand

时间:2017-01-27 14:17:59

标签: spring hystrix

在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吗?

感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

默认使用RequestContextHolder时,不会共享参数(有充分理由!)。

假设您使用DispatcherServlet来处理请求,可以将[threadContextInheritable]设置为true,以便RequestContextLocaleContext共享请求之间。

同样适用于RequestContextFilterRequestContextListener无法实现。

注意:我会考虑在线程之间共享HttpServletRequest作为您不应该做的事情,并且应该非常谨慎地完成!