Используя 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 , но мне не повезло.
Как сохранить объем моего запроса делать другую обработку? Может ли кто-нибудь указать мне правильное направление?