Как мне не потерять свои RequestAttributes в новом потоке? - PullRequest
0 голосов
/ 04 августа 2020

Используя Spring 4, в простом API POST я пытаюсь немедленно вернуть ответ и продолжить обработку в фоновом режиме.

@RestController
@RequestMapping("/somewhere")
public class SomeController {

    SomeService someService;

    @PostMapping(value = "/something")
    public ResponseModel getResponseAndDoOtherProcessing() {
        ResponseModel response = someService.getInitialResponse();
        // Async function
        someService.doOtherProcessing(response);
        return response;
    }
}

Первая функция getInitialResponse() вернет объект в быть отправлено обратно клиенту, но я хочу выполнить больше обработки, используя отправленный мной ответ. ответ клиенту (@ EnableAsyn c находится в настраиваемом файле):

@Async
@Override
public void doOtherProcessing(ResponseModel) {
  // do some stuff
  ...
  // get the request attributes for some other pieces
  RequestAttributes attributes = RequestContextHolder.currentRequestAttributes();
  ...
}

Но поскольку это в другом потоке, похоже, что теряются атрибуты запроса:

java.lang.IllegalStateException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet/DispatcherPortlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request.

Я искал несколько вещей, например, используя MODE_INHERITABLETHREADLOCAL, и читал некоторые отладочные части, такие как this , но мне не повезло.

Как сохранить объем моего запроса делать другую обработку? Может ли кто-нибудь указать мне правильное направление?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...