2

Java Web サービス コード ベース (BEA/Oracle Weblogic) を継承しており、Web サービスから外部バックグラウンド アプリケーションを開始/起動する必要があります。

私はすでに試しました:

ProcessBuilder pb = new ProcessBuilder(arg);
pb.start();

としても:

Runtime.exec(cmdString);

しかし、この方法でアプリケーションを起動すると、奇妙な動作が発生します (つまり、起動したアプリケーションは、プロセスがまだアクティブであっても動作を停止します。- 通常のコマンド ラインから手動で実行すると、アプリケーションは正常に動作します)。

外部プロセスを起動するより良い方法はありますか?

編集: - - - - - - - - - - -

問題を明らかにするのに役立つ追加情報があります。

  • 開始しようとしているプロセスが完了するまでに数時間かかるため、Web サービスで ( を使用して) 完了するのを待つwaitfor()ことは理想的なシナリオではありません。
  • はい、Web サービスから開始しようとしているプロセスは、仲間のチーム メンバーによって作成されました [キュー: 目が回る... 今]

プロセス ビルダーを使用してbash スクリプトを開始すると、外部アプリケーションがバックグラウンド プロセスとして起動されます(「&」を使用)。

#!/bin/bash
java -jar myApp.jar &

これにより明らかに孤立したプロセスが作成されますが、少なくともアプリケーションは引き続き実行されます。

4

5 に答える 5

2

まず、これはWindowsまたはLinuxで発生していますか?また、起動されたアプリケーションは多かれ少なかれ何をするはずですか?(それはスクリプトですか?それはバイナリですか?それはあなたのバイナリですか?)

編集

OK、bashスクリプトを開始すると(を使用してProcessBuilder)、新しいJVM(java -jar myApp.jar)が生成されます。

を使用して新しいJVMを直接生成しようとすると、正確にはどうなりますProcessBuilderか?あなたは最初に言った:

起動したアプリケーションが動作を停止します

  1. 起動されたアプリケーションとは、中間スクリプトを介さに直接呼び出された場合の「java -jarmyApp.jar」を意味しますか?bash
  2. ProcessBuilderJavaを直接起動しようとして、この新しいJVMが機能しなくなったときに、さまざまなメソッドに(そしてその順序で)渡す正確で完全なパラメーター(およびそれらの値)は何ですか?(例:注釈付きコードを提供する)
  3. * nixマシンにインストールする場合、実行時lsofにファイル記述子2に関連付けられていることが示されているファイル(FD列を参照):( 「ハングした」JVMのプロセスIDはlsof -p 1234どこにありますか?)ここでのコマンド1234の出力全体。lsof
  4. 上記の手順3(ファイル記述子2の場合)で識別したファイルに、コマンドを発行してから最大数秒後に何が追加されますか( 「ハングした」JVMのプロセスIDはkill -QUIT 1234どこにありますか?)1234
于 2009-03-14T03:56:15.940 に答える
2

「プロセスがまだアクティブであっても動作を停止する」とは、起動したアプリケーションからの出力を期待していて、何も得られないことを想定しています。

以下を使用してみてください。

ProcessBuilder pb = new ProcessBuilder(arg);
Process p = pb.start();
p.waitFor();

waitFor() は、必要に応じて、この Process オブジェクトによって表されるプロセスが終了するまで、現在のスレッドを待機させます。

http://java.sun.com/javase/6/docs/api/java/lang/Process.html#waitFor()

于 2009-03-14T20:17:37.370 に答える
1

プロセスの標準の入力と出力を適切に処理していますか?標準の入力または出力がアプリケーションによって処理されていて、それを適切に処理していない場合、実行するプロセスはI/Oを待機してハングします。

これをテストする方法は、プログラムを実行するスクリプトを作成し、標準の入力、出力、およびエラーをファイルにリダイレクトすることです。次に、Webサービスアプリにプログラムの代わりにスクリプトを実行させます。プログラムがこのように完了するまで実行される場合、問題はプロセスの出力の処理です。

于 2009-03-14T02:44:06.457 に答える
0

問題は、プロセスを起動するスレッドが TERMINATED になるか、リクエストが終了した後に発生する可能性があると推測しています。常に生きていると確信しているアプリケーションに単一のスレッドを用意してみてください。これを使用して、他のスレッドから呼び出しを行うことでプロセスを開始できます。

于 2009-03-13T20:39:18.970 に答える