Как не потерять атрибуты запроса при создании асинхронной (асинхронной) передачи из одной службы Rest в другую

#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. Нет, просто для того, чтобы иметь возможность получать заголовки в перехватчике запросов, который в основном представляет собой запрос, поступивший из асинхронного вызова, который в основном представляет собой новый поток.