Я относительно новый для Spring ботинке и начал с очень простым примером из их getting started site, что (на стороне контроллера):Как обрабатывать несколько запросов параллельно с @RestController от SpringBoot?
@RestController
public class HelloController {
@RequestMapping("/")
public String index() {
return "Greetings from Spring Boot!";
}
}
Что я хочу сейчас, что многократный (потенциально длительные) запросы того же контроллера может обслуживаться в parallel.
Поскольку я уже узнал, что Обновление: My bad: Я думал, что это связано с тем, что контроллер был синглом. Но верно: почему он не может работать параллельно?@RestController
будет экземпляр, как одноэлементные, то ясно для меня, что множественные запросы (которые обрабатываются таким же способом) будут обработаны последовательно .
Так что я изменил приведенный выше пример, как следует, так что новый экземпляр контроллера создается при каждом запросе и с некоторыми средствами проверки того, что происходит на самом деле:
@RestController
@Scope(value = "request")
public class HelloController {
private static AtomicInteger count = new AtomicInteger(0);
public HelloController() {
count.incrementAndGet();
}
@PostConstruct
public void init() {
System.out.println("start request " + count);
}
@PreDestroy
public void onDestroy() {
System.out.println("end request " + count);
}
@RequestMapping("/")
public String index() throws InterruptedException {
LocalDateTime now = LocalDateTime.now();
TimeUnit.SECONDS.sleep(15);
System.out.println(now);
return "Greetings from Spring Boot! " + now + " " + count.get();
}
}
Теперь я хотел бы ожидать, чтобы увидеть, что запросы обрабатываются параллельно в течение примерно 15 секунд, но на самом деле я вижу только то, что он, очевидно, обрабатываются последовательно, и что она занимает 30 секунд (на стандартный вывод):
start request 1
2017-02-11T14:19:47.429
end request 1
start request 2
2017-02-11T14:20:02.467
end request 2
Так что мой вопрос: Как я могу добиться, чтобы такие запросы обрабатывались в параллельно, поскольку, очевидно, недостаточно создать экземпляр для каждого запроса?
Маленькая ремарка: я уже пробовал использовать @Asnync
аннотацию в сочетании с @EnableAsync
для класса приложений, но это, кажется, «огонь и забыть», что я не могу получить ответ, чтобы показать на стороне клиента ,
Несколько статей здесь, в stackoverflow (например, this и this) были интересными, но также не отвечали на мой вопрос, и этот учебник не касался asynchronous methods.
Update: Так как несколько человек указали, что проблема может быть связана с тем, как я проверил, я попытался запустить его с помощью другого браузера. Интересно, что я столкнулся с такими же проблемами как в Chrome, так и в Firefox. Но при выполнении одного запроса от каждого, он показал ожидаемое поведение (обслуживающий запросы параллельно) - так что я был одурачен ... фрезы
Как вы выполняете параллельные запросы? – Andremoniy
Как вы можете проверить свою конечную точку HelloController? Используя ваш браузер (открыть 2 вкладки) или модульное тестирование (используйте потоки)? – algojava
«Поскольку я уже узнал, что @RestController будет создан как singleton, для меня ясно, что несколько запросов (которые обрабатываются одним и тем же методом) будут обрабатываться последовательно». Это утверждение неверно. В контейнере сервлета каждый запрос обрабатывается в другом потоке. Если ваш метод контроллера не синхронизирован, запросы будут обрабатываться вашим контроллером в parrallel – gregfqt