サーブレット (バージョン 7) を使用して Java EE で記述された Web アプリケーションをテストしています。サーブレットに大量の HTTP リクエストを送信しています。すべてのリクエストがいつ完了するかを知りたいです。
リクエストを送信するには、エグゼキュータを使用しています。また、これが最も効率的な方法であるかどうかもわかりません。
for (int i=0; i < numRequests; i++) {
ExecutorService executor = Executors.newFixedThreadPool(1);
Future<util.Response> responseFromServlet = null;
responseFromServlet = executor.submit(new util.Request(new URL(url)));
if ( i != numRequests -1 ) {
executor.shutdown();
} else {
responseFromServlet.get().getBody(); // suspensive call for last invocation
executor.shutdown();
}
}
実際には、エグゼキューターは最後に呼び出された HTTP 要求の終了を待ちますが、通常、完了するのは最後ではありません。
各HTTPサーブレットのレスポンス待ちスレッドを新たに作るのはおかしいと思います。リクエストごとに 1 つずつ、100 ~ 200 ~ 300 のスレッドを生成できません。
では、すべてのサーブレットがいつ実行を終了するかを理解する方法はありますか? 必要に応じて、サーブレットを変更できます。
=== 編集 ===
より正確には、Request クラスの実装は次のとおりです。
public class Request implements Callable<Response> {
private URL url;
public Request(URL url) {
this.url = url;
}
@Override
public Response call() throws Exception {
return new Response(url.openStream());
}
}
これが Response クラスです。
public class Response {
private InputStream body;
public Response(InputStream body) {
this.body = body;
}
public InputStream getBody() {
return body;
}
}