そのため、Spring MVC (主に REST コントローラーのみ) でコンテナーなしでベンチマークを実行しようとしています。Spring とそのリクエスト処理だけです。Jersey を使用すると、次のようなことができます。
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 リクエスト処理へのメイン エントリ ポイントです。すべてのジャージー構成は にあり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
が nullであることを意味すると推測しています。しかし、私はそれを上に設定しています。
NPEであろうとなかろうと、私はこれを正しい方法で行っているかどうかさえわかりません。ではなく、調べなければならない他のコンポーネントがある場合DispatcherServlet
。
誰でもこれを機能させる方法を知っていますか? 別のメソッドを呼び出して、別のコンポーネントを調べる必要がありますか? 上記の試行を実際に機能させるために欠落している可能性のある構成はありますか?
要件スタンド
- JMHを使う
- リクエストからレスポンスまでのSpring処理のみのスループットをテストします。
GitHub で完全な実行可能なプロジェクトを参照してください