Этот вопрос относится к this. У меня есть служба Restful, которая вызывает несколько веб-сервисов в асинхронном режиме (используя потоки - огонь и забыть). Я передаю заголовки запросов, полученные моей службой, до этих веб-сервисов. Однако, поскольку эти запросы запускаются асинхронно, они обычно выполняются после того, как моя служба REST возвращает ответ. Это приводит к потере объекта запроса HTTP. Следовательно, как предложено в этом потоке, я использую область сеанса для сохранения заголовков запросов. Будет ли это иметь какое-либо негативное влияние, которое я должен проанализировать. Есть ли лучший подход, на который я должен смотреть?Сессия Сфера в Rest Rest Spring Services
1
A
ответ
1
Если вы начинаете использовать область сеанса для хранения запросов, ваша служба больше не RESTful, потому что она не является апатридом. Я бы посоветовал вообще не использовать возможности сеанса.
Если вам нужно использовать объект запроса в асинхронном потоке (используя аннотацию весны @Async
), просто передайте ее асинхронной логике через параметр.
Что-то вроде этого:
@Component
public class AsyncUserService {
@Async("customTaskExecutor")
public void updateOrAddUser(int id, HttpServletRequest request) throws {
//do your stuff
}
}
@Controller
@RequestMapping("/users")
public class UserController {
private final AsyncUserService userService;
@Autowired
public UserController(AsyncUserService userService) {
super();
this.userService = userService;
}
@RequestMapping(value = "/{id}", method = RequestMethod.PUT)
@ResponseStatus(HttpStatus.OK)
public void putUser(@PathVariable("id") int identifier, HttpServletRequest request) {
userService.updateOrAddUser(identifier, request);
}
}
Благодаря luboskrnac, я использовал асинхронной аннотацию для запуска асинхронных запросов, но контекст запроса терялся в перехватчиков, которые перехваченных Бэкэнд вызовов. Я попробую еще раз –
У меня также есть другой вопрос. В этом сценарии я использую компонент с областью сеанса, чтобы сохранять значения только для моих асинхронных вызовов, а не использовать его для обеспечения работоспособности службы. Можете ли вы помочь в объяснении неблагоприятных воздействий, которые это может вызвать? Спасибо! –
В вашем случае это может быть не проблема, но использование области сеанса, когда вы просто можете передать запрос в поток через параметр, просто не имеет смысла для меня. Когда я работаю над службами REST, область сеанса - это большой восклицательный знак при просмотре кода. – luboskrnac