1

所以我试图在没有容器的情况下对 Spring MVC(主要只是使用 REST 控制器)进行一些基准测试;只是 Spring 及其请求处理。有了泽西岛,我可以做这样的事情:

private volatile ApplicationHandler handler;
private volatile ContainerRequest request;

@Setup
public void start() throws Exception {
    handler = new ApplicationHandler(new JerseyAppConfig());
    request = ContainerRequestBuilder
            .from("/hello?test=HelloWorld", "GET")
            .build();
}

@Setup(Level.Iteration)
public void request() {
    request = ContainerRequestBuilder
            .from("/hello?test=HelloWorld", "GET")
            .build();
}

@Benchmark
public Future<ContainerResponse> measure() throws Exception {
    return handler.apply(request);
}

ApplicationHandler是 Jersey 请求处理的主要入口点。我所有的 Jersey 配置都在JerseyConfig. 基本上所有发生的事情是我创建请求(ContainerRequest),然后处理请求只是对处理程序进行调用,传递请求。请求经过请求处理周期后,返回响应。

我试图用 Spring MVC 模仿同样的功能。真的,我什至不知道我将如何去做。我刚开始往墙上扔东西,希望它能粘住。我有点想也许我可以用DispatcherServlet(或更准确地说FrameworkSevlet)来做到这一点。但为了做到这一点,我能看到的唯一方法是processRequest通过反射使受保护的对象可以访问。这是我的尝试

private volatile AnnotationConfigWebApplicationContext appContext;
private volatile FrameworkServlet dispatcherServlet;
private volatile HttpServletRequest request;
private volatile HttpServletResponse response;
private volatile Method processRequest;

@Setup
public void start() throws Exception {
    appContext = new AnnotationConfigWebApplicationContext();
    appContext.register(SpringAppConfig.class);
    dispatcherServlet = new DispatcherServlet(appContext);

    processRequest = dispatcherServlet.getClass().getSuperclass()
            .getDeclaredMethod("processRequest",
                    HttpServletRequest.class,
                    HttpServletResponse.class);
    processRequest.setAccessible(true);
}

@Setup(Level.Iteration)
public void request() throws Exception {
    request = new MockHttpServletRequest("GET", "/hello");
    response = new MockHttpServletResponse();
}

@Benchmark
public void measure() throws Exception {
    processRequest.invoke(dispatcherServlet, request, response);
}

这虽然行不​​通。我在这条线上得到了一个 NPE ,我猜这意味着它webApplicationContext是空的。但我在上面设置它。

NPE 与否,我什至不确定我是否以正确的方式进行此操作;如果我应该研究其他一些组件而不是DispatcherServlet.

任何人有任何想法如何使这项工作?我应该研究另一个组件,调用不同的方法吗?我可能缺少任何配置来实际使我的上述尝试起作用?

要求立场

  • 使用 JMH
  • 仅测试 Spring 处理请求到响应的吞吐量。

在 GitHub 上查看完整的可运行项目

4

1 回答 1

1

您可以在此处查看DispatcherServletSpring 框架代码库中提供的测试用例,它可以为您提供有关所需正确设置和请求/响应模拟的指针。您也可以在此处获得正确设置的示例。

于 2015-09-22T17:10:21.540 回答