#spring #spring-boot #asynchronous
#spring #spring-boot #асинхронный
Вопрос:
В настоящее время я сталкиваюсь со следующей проблемой:
- Служба Rest (реализована с использованием Spring Boot)
- Внутри моей службы rest мне нужно выполнить асинхронный вызов другой службы rest.
- Я использую
@Async
общедоступный метод into, который будет выполнять асинхронный вызов. - Я использую Feign Client для выполнения этого вызова rest.
- Я перехватываю запрос с помощью
feign.RequestInterceptor
Теперь проблема:
В текущей реализации RequestInterceptor
мы имеем
@Override
public void apply(RequestTemplate requestTemplate) {
/// Getting a NullPointer here as obviously we have changed the from one thread to another
/// when the async call was made
final HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
.getRequest();
//some other irrelevant logic for this example....
}
Когда мы переходим от одного потока к порожденному потоку, информация теряется.
Я предполагаю, что это связано с threadlocal
и каким-то образом я должен передать информацию в inheritablethreadlocal
.
Каким должен быть подход, позволяющий передавать ServletRequestAttributes порожденному потоку без потери информации? (в основном я заинтересован в том, чтобы иметь возможность сохранять заголовки, которые были в исходном потоке).
Комментарии:
1. Но я хочу установить для этих заголовков конкретные заголовки (не все те, которые были в исходном запросе, а их подмножество) в RequestTemplate. Поэтому я должен делать это, когда перехватываю запрос. Это означает, что я не могу просто передать эти заголовки методу async, поскольку метод async в основном вызывает клиент Feign, и тут же запрос перехватывается, заголовки фильтруются и добавляются в requestTemplate .
2. Нет, просто для того, чтобы иметь возможность получать заголовки в перехватчике запросов, который в основном представляет собой запрос, поступивший из асинхронного вызова, который в основном представляет собой новый поток.