Spring-Boot: обрабатывать несколько запросов одновременно
Я использую Spring Boot для создания веб-службы RESTful. Моя IDE - это Eclipse Oxygen.
Я отправляю несколько запросов HTTP через каждые 2 секунды через Chrome, но они запускаются один за другим. Каждый запрос будет ждать окончания предыдущего запроса.
Вот мой код контроллера:
@RestController
@RequestMapping("/dummy")
public class DummyController {
@RequestMapping(method = RequestMethod.GET)
public ResponseEntity<Map<String, String>> dummytsp(@RequestParam(value="msg", defaultValue="Hello") String msg) {
System.out.println("" + new Date() + ": ThreadId " + Thread.currentThread().getId());
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Map<String, String> response = new HashMap<>();
response.put("message", msg);
return new ResponseEntity<>(response, HttpStatus.OK);
}
}
Моя консоль на выходе:
Thu Sep 14 11:31:15 EDT 2017: ThreadId 25
Thu Sep 14 11:31:20 EDT 2017: ThreadId 26
Thu Sep 14 11:31:25 EDT 2017: ThreadId 28
Thu Sep 14 11:31:30 EDT 2017: ThreadId 30
Выход консоли показывает, что контроллер вызывается каждые 5 секунд. Но я отправляю запросы каждые 2 секунды.
Как я могу обрабатывать несколько входящих запросов одновременно? (Я должен видеть вывод консоли каждые 2 секунды)
ОБНОВЛЕНИЕ:
Если я отправляю запросы в разных браузерах, это работает отлично. Если я протестирую его в том же браузере / приложении, которое разделяет сеанс, проблема возникнет.
Можно ли принимать одновременно несколько запросов из одного сеанса?
Спасибо!
2 ответа
По умолчанию веб-приложения Spring Boot являются многопоточными и обрабатывают несколько запросов одновременно.
Это может быть специфическая особенность браузера. В Windows 10 Chrome и Firefox, похоже, ставят в очередь несколько запросов на один и тот же URL, а IE, Edge и & curl - нет.
Spring bean по умолчанию являются синглтон-бинами. Синглтон означает один экземпляр объекта на контейнер. Так что на самом деле в одном контейнере есть один экземпляр DummyController. Первый запрос приходит, и Нить идет спать на 5 секунд. Как только он проснется, завершится выполнение и объект будет освобожден, что будет подхвачено вторым запросом. Проверьте, является ли контроллер REST многопоточным?