Внутри 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?
Любая помощь приветствуется.
Хм ... На самом деле, не совсем вонючий, вы обращаетесь к запросу вообще? Похоже, вы пытаетесь сделать что-то, чего не следует делать в первую очередь. –
Наше приложение обслуживает разные страны (клиенты), поэтому, когда дело доходит до создания URL-адресов REST для получения данных от сторонних бэкендов, Клиент должен учитываться в URL-адресе. Поэтому мы делегировали эту клиентскую обработку в пользовательский ClientContext.java, который мы можем получить в любом случае. Это просто для удобства, в противном случае нам нужно будет проходить через клиента повсюду, что является болью. –
Но что же делать с введением «HttpServletRequest» в аннотированный метод «@ HystrixCommand»? Также приятно знать, что вы используете простой Hystrix или Spring Cloud, завернутый в один? Я бы сказал, что ваш 'ClientContext' должен быть отделен от запроса (вы можете создать его на основе входящего запроса, но после этого больше не должны полагаться на него). Что бы облегчить совместное использование объекта (который, я надеюсь, только для чтения). –