【发布时间】:2011-02-17 12:13:51
【问题描述】:
我正在使用 Spring MVC 框架的一部分;特别是,我将@Controller、@RequestMapping 和@ResponseBody 注释与连接到OXM jaxb2 marshaller bean 的webstatsHttpMessageConverter 结合使用。我的控制器方法使用 @RequestParam 注释来解析一些 GET 参数,查询在后台使用 JPA EntityManager 的服务,并返回一个 JAXB 对象,该对象由 HttpMessageConverter 转换为其 XML 表示形式。
我将这个场景简化为一个非常简单的测试用例,以尝试确定我注意到的执行延迟的位置;示例控制器方法:
@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 类的对象。我的理解是这个控制器应该能够同时运行这些方法,每个调用 /my_service__method_endpoint 的 HTTP 请求一个。我在这里遗漏了一些基本概念吗?上面代码的日志输出表明,对 getSomeData 的每次调用都在等待上一次调用完成运行,然后才开始运行。这在大容量环境中显然是非常不可取的。
【问题讨论】:
-
您是如何生成 HTTP 请求的?使用自动化测试还是浏览器?另外,我们可以看看最小的 Spring 配置,看看一切是如何连接起来的吗?
-
目前,我只是在浏览器中生成多个 HTTP 请求。我也有执行请求的自动化测试用例,但它们不是并发的——它们的存在只是为了验证生成的 XML 是否正确。有机会我会尽快发布 Spring 配置。
-
浏览器有内置的逻辑来限制并发请求,它们是做这类事情的一个非常糟糕的工具。您需要使用自动化工具重现负载测试。
-
@skaffman:是的,现在我觉得自己像个白痴。这将教会我懒得启动 JMeter 测试计划。谢谢!
标签: spring-mvc