2015-11-24 3 views
1

Этот вопрос относится к this. У меня есть служба Restful, которая вызывает несколько веб-сервисов в асинхронном режиме (используя потоки - огонь и забыть). Я передаю заголовки запросов, полученные моей службой, до этих веб-сервисов. Однако, поскольку эти запросы запускаются асинхронно, они обычно выполняются после того, как моя служба REST возвращает ответ. Это приводит к потере объекта запроса HTTP. Следовательно, как предложено в этом потоке, я использую область сеанса для сохранения заголовков запросов. Будет ли это иметь какое-либо негативное влияние, которое я должен проанализировать. Есть ли лучший подход, на который я должен смотреть?Сессия Сфера в Rest Rest Spring Services

ответ

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); 
    } 
} 
+0

Благодаря luboskrnac, я использовал асинхронной аннотацию для запуска асинхронных запросов, но контекст запроса терялся в перехватчиков, которые перехваченных Бэкэнд вызовов. Я попробую еще раз –

+0

У меня также есть другой вопрос. В этом сценарии я использую компонент с областью сеанса, чтобы сохранять значения только для моих асинхронных вызовов, а не использовать его для обеспечения работоспособности службы. Можете ли вы помочь в объяснении неблагоприятных воздействий, которые это может вызвать? Спасибо! –

+0

В вашем случае это может быть не проблема, но использование области сеанса, когда вы просто можете передать запрос в поток через параметр, просто не имеет смысла для меня. Когда я работаю над службами REST, область сеанса - это большой восклицательный знак при просмотре кода. – luboskrnac