Java の ProcessBuilder クラスを使用して外部プロセスを実行しています。プロセスは、Java プログラムが終了する前に終了してはなりません。コマンド/応答モードで存続する必要があります。
プロセス ストリームは無視すると簡単に「ジャム」する可能性があることを知っているので、次のことを行いました。 プログラムは、プロセスの結合された出力ストリームとエラー ストリームを「リーダー」スレッドで読み取り、「ライター」スレッドを使用してコマンドを管理します。 . リーダー スレッドは、プロセス出力からの文字読み取りをブロックし、それらを文字列にバッファリングして、結果をディスパッチします。書き込みスレッドは、PrintWriter を介して完全な「コマンド」行を書き込みます。キューを使用して、2 つのコマンド書き込みが「近すぎ」(現在は 100 ミリ秒) ないようにし、前のコマンドの出力が完了する前に新しいコマンドが書き込まれないようにします。また、すべての println() の後に、flush() と checkError() を呼び出します。
このスキームは、数秒または数分間正常に機能し、その後、読み取りスレッドがブロッキング read() でハングします。エラーも例外もスローされず、プロセス出力もありません。その後、外部プロセスを復活させるものは何もありません(再起動する以外)。(ところで、これは Linux と Windows の両方で発生します。)
Jakarta Commons Exec と Plexus Utils http://plexus.codehaus.org/plexus-utils/のコードとテストケースを見てきましたが、(a) どちらも長寿命のプロセスを使用する例を示しておらず、( b) どちらも、私が説明したことと基本的に異なることをしているようには見えません。
ここで何が起こっているのか、誰にも分かりませんか?ありがとう!