Я использую части фреймворка Spring MVC; в частности, я использую аннотации @Controller, @RequestMapping и @ResponseBody в сочетании с webstatsHttpMessageConverter, подключенным к бину маршаллера OXM jaxb2. Мои методы контроллера используют аннотации @RequestParam для анализа некоторых параметров GET, запроса сервиса, который использует JPA EntityManager за кулисами, и возвращает объект JAXB, который преобразуется в его представление XML с помощью HttpMessageConverter.
Я сократил этот сценарий до очень простого контрольного примера, чтобы попытаться определить местоположение задержки выполнения, которую я заметил; Пример метода контроллера:
@RequestMapping("/my_service__method_endpoint")
@ResponseBody
public Jaxb2CompiledClass getSomeData(@RequestParam String param1,
@RequestParam Date start, @RequestParam Date end) {
log.debug("Entering getSomeData");
Thread.sleep(5000);
log.debug("Finished waiting, leaving getSomeData);
return new Jaxb2CompiledClass();
}
Этот сценарий работает нормально и возвращает соответствующие данные в соответствующем формате. Однако во время нагрузочного тестирования этой конфигурации я столкнулся с проблемой - каждый из моих методов контроллера, аннотированных @RequestMapping, не будет работать одновременно; если я создаю несколько HTTP-запросов к конечной точке службы, каждый вызов метода завершается до обработки следующего HTTP-запроса. В моем реальном коде я использую сервисные объекты для извлечения результатов через JPA и преобразования этих результатов в объект соответствующего класса Jaxb2. Насколько я понимаю, этот контроллер должен иметь возможность запускать эти методы одновременно, по одному для каждого HTTP-запроса, вызывающего / my_service__method_endpoint. Есть ли какая-то фундаментальная концепция, которую я здесь упускаю? Вывод журнала из приведенного выше кода показывает, что каждый вызов getSomeData ожидает завершения предыдущего вызова, прежде чем начинать работу. Это очевидно крайне нежелательно в среде с большим объемом.