所以我试图在没有容器的情况下对 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 上查看完整的可运行项目