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 многопоточным?

Другие вопросы по тегам