0

サーブレットから外部プロセスを開始しています。

try {
    Process proc = Runtime.getRuntime().exec("java  -jar " + jarLocation );
  • サーブレットと外部プロセスは、同じユーザー ID/パスワードで同じデータベースにアクセスします。

  • サーブレットは、外部プロセスが終了するのを待ちません。

  • サーブレットは 1 秒以内に処理を終了します。

  • サーブレットから開始した場合、外部アプリが完了するまでに少なくとも 2 分かかります。

  • スタンドアロン モードで実行すると、外部アプリが完了するまでに約 5 秒かかります。

外部プロセスの開始後に Web アプリを停止しようとしたところ、外部プロセスがすぐに終了しました。

そのため、サーブレットと外部プロセスの間に何らかの相互作用があり、プロセスの完了に時間がかかりすぎているようです。私たちは数日間、何が起こっているのかを突き止めようとしてきましたが、どこにも行き着きませんでした.

ここで何が起こっているのか誰にも分かりませんか?

4

1 に答える 1

2

生成されたプロセスの stdout/stderr をサーブレット プロセスで使用する必要があります。

そうしないと、生成されたプロセスが消費されるのを待ってブロックされる可能性があります。これを行うには少し複雑です。詳細については、この回答とそのリンクされた記事を参照してください。

Process.waitFor()生成されたプロセスの終了コードを収集するには、を実行する必要があることに注意してください。そうしないと、手にゾンビがいます。したがって、サーブレットがプロセスを生成してすぐに戻ることができるように、これらすべてを別のスレッドにラップすることをお勧めします。

そうは言っても、新しい Java プロセスを起動する場合、同じ JVM 内からライブラリ関数として呼び出すように単純にリファクタリングできませんか? プロセスの生成は、比較的負荷が高く、時間のかかるタスクです。

于 2013-10-09T15:57:40.463 に答える