2

サービスエンドポイントのストレステストを行い、httpPOSTリクエストを作成したいと思います。

ソリューションで次のいずれかを実行できるようにしたい:

  1. 100Kなど、特定の数のリクエストを行います
  2. x分間実行し続ける

これまでのところ、次のようなexecutorserviceを使用してソリューションを作成しました。

int MAX_THREADS = 20;
int MAX_REQUESTS = 1000;

ExecutorService es = Executors.newFixedThreadPool(MAX_THREADS);

for(int x = 0; x < MAX_REQUESTS; x++) {
  es.execute(new MyTask());
}

es.shutdown();

try {
  es.awaitTermination(..);
}
catch(...) {

}

MyTaskがRunnableを実装し、HttpClient(apache)を使用してHttpPostを作成する場合。

したがって、これによりスレッドのセットプールが作成され、タスクがx回呼び出されます。

これを変更して、指定した分数も実行できるようにするにはどうすればよいですか?

開始/終了時間の統計を取得するには、futuresを使用する必要があるため、各スレッドを使用して、正しく実行するのにかかった時間を返しますか?

また、実行可能なタスクでは、HttpClientオブジェクトの新しいインスタンスを作成し、投稿とともに送信するファイルをロードしています。これによりベンチマークが遅くなると思いますが、リクエストを行うための実際の呼び出しを除いて、すべてのセットアップでhttpclientを再利用する方法はありますか?

誰かがそれを言及する前に、私はすでにこれを行うjmeterなどのツールがあることを知っていますが、これがどのように機能するかを学びたいと思います。

4

2 に答える 2

4

Apache JMeterを使用できるのに、なぜ自分で作成するのですか?アプリケーションのニーズに合わせてシンプルなプラグインを作成し、JMeterのすべての負荷生成の可能性をすぐに利用できます。インターバルなどでのランニングも含みます。

于 2012-05-25T15:27:07.187 に答える
1

あなたがすべきことは、一定の時間の間終了を待ってから、を呼び出すことes.shutdownNow()です。だから次のようなもの:

// start your executor service like you do
// submit your jobs
// shutdown the service so no new jobs are added
es.shutdown();
try {
   // wait for it to complete for only a certain amount of time
   if (!es.awaitTermination(1. TimeUnit.MINUTES)) {
       // if timed out waiting then flush remaining jobs and interrupt running
       es.shutdownNow();
       // now wait forever for it to finish after you've stopped the jobs
       es.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS);
   }
} catch(...) {

私がこれに関して持っている1つの質問は、shutdownNow()あなたが電話した後に_を呼び出すことが合法であるかどうかですshutdown()。私はそれについて100%確信していません。

注:タスクが長時間実行されている場合は、適切に中断できるように、タスクがループしているかどうかを監視しInterruptedException、テストする必要があります。Thread.currentThread().isInterrupted()shutdownNow()

于 2012-05-25T15:25:39.387 に答える