Javaサーブレットから長いプロセスを実行するための最良のアプローチは何ですか。Webアプリケーションがあり、クライアントがリクエストを実行すると、サーブレットが実行されます。このサーブレットは、リクエストからいくつかのパラメータを取得してから、プロセスを実行する必要があります。このプロセスには時間がかかる場合があるため、個別に実行する必要があります。このプロセスが終了すると、結果が記載されたメールが送信されます。
前もって感謝します。
スレッド プールを使用します。リクエストを受け取るたびに、タスクを作成してスレッド プールに送信します。これにより、リクエストが多すぎてもサーバーが機能しなくなることはありません。これは、使用できる同時スレッドの数と、スレッド プールの待機中のタスクのキューで待機できるタスクの数を制御できるためです。
ExecutorsおよびThreadPoolExecutorについては、javadoc を参照してください。
これを行うには2つの可能性があります。
WebSphere MQ
2 番目のアプローチには利点があります。アプリが何らかの理由で現在リクエストを処理できない場合、アプリは後でリクエストに戻ることができます。
サーブレットの呼び出しによってプロセスが生成されるというのは少し危険に思えますが (適切なスロットリング機能が実装されていない場合)、 を使用してプロセスを生成できますRuntime.getRuntime().exec()
。ProcessBuilder
プロセス引数を準備して生成するために使用する方がはるかに優れています。
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.