2017-01-27 33 views
0

Внутри Javanica аннотированный @HystrixCommand мы проверяем, если запрос был в действительности запроса сервлета HTTP путем проверки:Spring HttpServletRequest недоступны в HystrixCommand

RequestContextHolder.getRequestAttributes() != null; 

Однако вызывается из @HystrixCommand это условие всегда ложно, даже если запрос пришел из запроса 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

Хм ... На самом деле, не совсем вонючий, вы обращаетесь к запросу вообще? Похоже, вы пытаетесь сделать что-то, чего не следует делать в первую очередь. –

+0

Наше приложение обслуживает разные страны (клиенты), поэтому, когда дело доходит до создания URL-адресов REST для получения данных от сторонних бэкендов, Клиент должен учитываться в URL-адресе. Поэтому мы делегировали эту клиентскую обработку в пользовательский ClientContext.java, который мы можем получить в любом случае. Это просто для удобства, в противном случае нам нужно будет проходить через клиента повсюду, что является болью. –

+0

Но что же делать с введением «HttpServletRequest» в аннотированный метод «@ HystrixCommand»? Также приятно знать, что вы используете простой Hystrix или Spring Cloud, завернутый в один? Я бы сказал, что ваш 'ClientContext' должен быть отделен от запроса (вы можете создать его на основе входящего запроса, но после этого больше не должны полагаться на него). Что бы облегчить совместное использование объекта (который, я надеюсь, только для чтения). –

ответ

1

При использовании RequestContextHolder по умолчанию параметры не разделены (по уважительным причинам!).

Предполагая, что вы используете DispatcherServlet, чтобы обработать Ваш запрос вы можете установить его [threadContextInheritable], чтобы true иметь RequestContext и LocaleContext общего между запросами.

То же самое относится к RequestContextFilter, это невозможно с помощью RequestContextListener.

Примечание: Я бы хотел поделиться HttpServletRequest между потоками, как то, что вы не должны делать, и это должно быть сделано с большой осторожностью!

+0

Я предполагаю, что совместное использование HttpServletRequest для HystrixCommand будет беспорядочным, когда вы начнете использовать RequestCollapsing в Hystrix правильно. –

 Смежные вопросы

  • Нет связанных вопросов^_^