3

サーブレット (バージョン 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;
  }
}
4

2 に答える 2

1

エグゼキューターを使用しても問題ありませんが、リクエストを実行する同時スレッドを増やすために、ThreadPool のサイズを増やしたい場合があります。

すべてのスレッドが完了するのを待っている初期化されたCoutnDownLatchを使用します。numRequests

util.Requestlatch.countDown()そのrunメソッドで呼び出す必要があります

コードは次のようになります (手書き - テストされていません)

ExecutorService executor = Executors.newFixedThreadPool(n);
final CountDownLatch latch = new CountDownLatch(numRequests); 
for (int i=0; i < numRequests; i++) {

     executor.submit(new util.Request(new URL(url), latch));
}
latch.await(someValue, TimeUnit.SECONDS)

` 編集

util.Request次のようなことを再実装します

 public class Request implements Callable<Response> {
  final private URL url;
  final private CountDownLatch latch;

  public Request(URL url, CountDownLatch latch) {
      this.url = url;
      this.latch = latch;
  }

  @Override
  public Response call() throws Exception {

       try {
          return new Response(url.openStream());
       } 
       catch (Exception e) {

          //do something useful
       }
       finally {
          latch.countDown();
       }
  }
}

ラッチをカウントダウンする前に、応答のストリームを消費して、サーバーからの応答として期待するものを取得したことを確認することをお勧めします。

于 2013-03-21T12:04:49.433 に答える
0

このプログラムを使用して負荷テストを実行している場合、またはそれ以外の場合でも、代わりにJmeterを使用することを強くお勧めします。Jmeter はすでにあなたがやろうとしていることを実行しており、負荷/スレッド数/期間などをスケジュールできるプラグインがたくさんあります。さまざまなグラフを通じてすべての HTTP リクエストを監視することもできます。

サーブレットのテストの作成には 5 分もかかりません。グラフも簡単に作成できます。

jmeter グラフ

カスタム プログラムを使用してサーブレットに接続したい場合は、いつでもリクエストの数を制限し、スレッドプール executor を介してブロッキング キューでバックアップすることができます。

最後に、サーブレットを変更しないでください。ブラックボックスとして監視できるはずです。

于 2013-03-21T12:32:24.060 に答える