Process proc
エラーが発生した場合、破棄して再作成する必要がある実行中です。
これは、stdin を介して解決できないプロセスにコマンドを送信する際の問題が原因です。
私の回避策は、構築した「接続」(stdin、stdout、stderr) をリセットし、新しいプロセスから新しいストリームを取得することです。プロセスが終了したときに、スレッドを使用して監視しています。エラーが発生した場合は、quit コマンドを使用してプロセスをシャットダウンし、スレッドを中断して、最終的にストリームを閉じます。
メインスレッドはすでに新しい接続を構築しています。接続を再構築した後にコマンドを送信すると、ストリームが閉じていることを示す IOException が発生します。
古いストリームをコピーして後で閉じる方法はありますか? すでに別のリーダーでラップして試しましたが、成功しませんでした。getXXXStream() を介してプロセスのストリームを取得し、それらを閉じるだけで十分かどうかはわかりません。これは、上記のリーダーを閉じないためです。また、新しいプロセスを取得してストリームを閉じることもできます。
でもブロックしたくない。
編集:
私の最初のコメントが述べているように、私はすぐにストリームを閉じますが、問題はProcess
残ります。それが閉じて proc を新しいものに再割り当てするのを1000ミリ秒待っている場合Process
、私のスレッドは新しいスレッドで動作します(例: calls exitValue()
)。
これが私のスレッドです:
private class ProcEndWatcherThread extends Thread
{
private BufferedReader out, err;
private PrintWriter wr;
public ProcEndWatcherThread(BufferedReader out, BufferedReader err, `PrintWriter wr)`
{
this.out = out;
this.err = err;
this.wr = wr;
//this.out = new BufferedReader(out);
//this.err = new BufferedReader(err);
//this.wr = new PrintWriter(wr);
}
@Override
public void run()
{
boolean closed = false;
try
{
isRunning = true;
proc.waitFor();
closed = true;
}
catch (InterruptedException e)
{
Thread.currentThread().interrupt();
}
finally
{
if(!closed)
proc.destroy();
try {
out.close();
err.close();
} catch (IOException e) {
log.throwing("ProcEndWatcherThread", "run", e);
}
wr.close();
isRunning = false;
log.info("Exitvalue: " + proc.exitValue());
}
}
}
私の接続を構築する方法(接続+再接続):
private void initCon() throws RException, IOException
{
proc = new ProcessBuilder(pathAndArgs).start();
System.out.println(proc.toString());
errRd = new BufferedReader(new InputStreamReader(
proc.getErrorStream()));
outRd = new BufferedReader(new InputStreamReader(
proc.getInputStream()));
BufferedWriter inWr = new BufferedWriter(new
OutputStreamWriter(new BufferedOutputStream(
proc.getOutputStream())));
pWr = new PrintWriter(inWr);
procEndWatcherThread = new ProcEndWatcherThread(outRd, errRd, pWr);
procEndWatcherThread.start();
... some initializing
}