#java #spring-boot #spring-restcontroller
Вопрос:
Я новичок в Spring Boot и в настоящее время проверяю, как работает мой пример API с помощью @RestController. Поведение этого метода при получении двух одновременных запросов, по-видимому, меняется в зависимости от того, прикрепляю я строку запроса или нет.
Вот мой пример кода:
@Slf4j
@RestController public class TestController {
@RequestMapping("/test")
public String test(){
String str = UUID.randomUUID().toString();
for(int i=0; i<100000; i ){
log.info(str);
}
return str;
}
}
Когда я вызываю этот метод без строки запроса от двух клиентов одновременно (http://localhost:8080/test), он работает последовательно. Журнал будет выглядеть так:
2021-09-16 18:20:14.914 INFO 19480 --- [nio-8080-exec-2] com.example.demo.TestController : e909a1ba-835c-4ecf-adfc-460cb03665eb
2021-09-16 18:20:14.914 INFO 19480 --- [nio-8080-exec-2] com.example.demo.TestController : e909a1ba-835c-4ecf-adfc-460cb03665eb
2021-09-16 18:20:14.908 INFO 19480 --- [nio-8080-exec-1] com.example.demo.TestController : cdd31851-a2d7-4c24-9369-c90b9926b65f
2021-09-16 18:20:14.908 INFO 19480 --- [nio-8080-exec-1] com.example.demo.TestController : cdd31851-a2d7-4c24-9369-c90b9926b65f
Идентификаторы UUID в журнале полностью разделены, поэтому кажется, что второй запрос обрабатывается после завершения первого.
С другой стороны, когда я вызываю его с помощью двух разных строк запроса (/test?a=1 и /test?a=2), он работает параллельно. UUID смешаны.
2021-09-16 18:20:14.928 INFO 19480 --- [nio-8080-exec-2] com.example.demo.TestController : e909a1ba-835c-4ecf-adfc-460cb03665eb
2021-09-16 18:20:14.928 INFO 19480 --- [nio-8080-exec-1] com.example.demo.TestController : cdd31851-a2d7-4c24-9369-c90b9926b65f
2021-09-16 18:20:14.928 INFO 19480 --- [nio-8080-exec-2] com.example.demo.TestController : e909a1ba-835c-4ecf-adfc-460cb03665eb
2021-09-16 18:20:14.928 INFO 19480 --- [nio-8080-exec-1] com.example.demo.TestController : cdd31851-a2d7-4c24-9369-c90b9926b65f
Этот метод не использует строки запроса, поэтому я думаю, что единственное различие между двумя случаями-это URL-адреса, которые получает Spring Boot.
Каковы внутренние различия в обработке между этими двумя случаями?
Комментарии:
1. я думаю, что здесь у вас может быть ложное предположение: то, что UUID отображаются последовательно, не обязательно означает, что они обрабатываются последовательно. Это может просто означать, что они передаются потокам последовательно, и по какой-то случайности поток 1 завершается до запуска потока 2. кроме того, во втором журнале все эти сообщения записываются сразу, а это означает, что они не обязательно находятся в правильном порядке.
2. Сколько раз вы проводили оба теста? Получили ли вы последовательные результаты, подтверждающие ваше предположение о последовательном и параллельном выполнении? Кроме того, здесь играет роль ведение журнала. Вместо регистрации не могли бы вы, пожалуйста, поместить
UUID
ее на карту с меткой времени и зарегистрировать ее один раз внеfor
цикла? Запустите тесты пару раз и поделитесь своими наблюдениями.3. Спасибо вам за ваши комментарии. Я попробовал провести дополнительный тест с использованием метки времени и получил тот же результат, но понял, что причиной является Chrome. Похоже, что Chrome может отправлять запросы на разные URL-адреса одновременно, но не для одного и того же. Когда я использовал Chrome и Firefox для каждого запроса, оба способа вызова приводили к одному и тому же результату.