【问题标题】:Spring MVC - @Controller annotation and processing concurrent requestsSpring MVC - @Controller 注解和处理并发请求
【发布时间】: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


【解决方案1】:

Skaffman 的响应是正确的 - 同时一切都运行良好,但是因为我懒得使用真正的负载测试工具,所以我的浏览器在请求发送之前就对其进行了限制。

【讨论】:

    猜你喜欢
    • 2015-04-28
    • 2021-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多