7

Javaサーブレットから長いプロセスを実行するための最良のアプローチは何ですか。Webアプリケーションがあり、クライアントがリクエストを実行すると、サーブレットが実行されます。このサーブレットは、リクエストからいくつかのパラメータを取得してから、プロセスを実行する必要があります。このプロセスには時間がかかる場合があるため、個別に実行する必要があります。このプロセスが終了すると、結果が記載されたメールが送信されます。

前もって感謝します。

4

4 に答える 4

5

スレッド プールを使用します。リクエストを受け取るたびに、タスクを作成してスレッド プールに送信します。これにより、リクエストが多すぎてもサーバーが機能しなくなることはありません。これは、使用できる同時スレッドの数と、スレッド プールの待機中のタスクのキューで待機できるタスクの数を制御できるためです。

ExecutorsおよびThreadPoolExecutorについては、javadoc を参照してください。

于 2013-01-22T12:29:44.100 に答える
2

これを行うには2つの可能性があります。

  1. タスクごとに個別のスレッドを作成します (スレッド プール アプローチ)。これは可能ですが、パフォーマンスの問題が発生する可能性があります。
  2. 2 番目のアプリケーションを作成します。たとえば、パラメータを DB に保存できます。2 番目のアプリケーションは、この DB を一定の間隔で監視し、何らかの処理を行います。DB の代わりに、次のようなメッセージ キュー マネージャーを使用できます。WebSphere MQ

2 番目のアプローチには利点があります。アプリが何らかの理由で現在リクエストを処理できない場合、アプリは後でリクエストに戻ることができます。

于 2013-01-22T12:29:44.767 に答える
2

サーブレットの呼び出しによってプロセスが生成されるというのは少し危険に思えますが (適切なスロットリング機能が実装されていない場合)、 を使用してプロセスを生成できますRuntime.getRuntime().exec()ProcessBuilderプロセス引数を準備して生成するために使用する方がはるかに優れています。

于 2013-01-22T12:30:13.817 に答える
2

Normally that kind of activities is delegated to another type of application module like a message driven bean and that seems to be the cleanest, and standards compliant solution to me. Although most servers won't complain if you create your own threads (which is forbidden by the standard but rarely enforced) the amount of management needed to set up your own job queue and pooled execution environment isn't really worth it in my opinion.

于 2013-01-22T12:32:53.513 に答える