への参照を取得し、私はテストを実行する前に、私は様々なサービスを開始し、次の統合テストコードを持っている:のJava:スレッドでの処理を開始し、作成したプロセス
@BeforeClass
public static void setup() throws Exception {
// Set some vars like javaBin location
ProcessBuilder builder = new ProcessBuilder(javaBin, "-jar", "app.jar");
Process process = launchProcess(builder);
}
private static Process launchProcess(ProcessBuilder builder) throws IOException {
AtomicReference<Process> process = new AtomicReference<>();
new Thread(() -> {
try {
process.set(builder.start());
BufferedReader processStd = new BufferedReader(new InputStreamReader(process.get().getInputStream());
BufferedReader processErr = new BufferedReader(new InputStreamReader(process.get().getErrorStream()));
// To prevent deadlocks due to limited buffer size
String s = "";
while(processStd .readLine() != null) {}
while((s = processErr .readLine()) != null) {
System.err.println(s);
}
}
catch (IOException e) {
e.printStackTrace();
}
}).start();
return process.get();
}
プロセスはOK開始しますが、 I process.get()
は常にnull
を返します。私は間違って何をしていますか?上記の方法を使用して、開始したプロセスへの参照を取得するにはどうすればよいですか? setup()
関数内にプロセスを設定した場合、すなわちprocess = builder.start()
の場合、正しく動作します。しかし、それは別のJVMで数多くの別々のサービスを開始する必要があるので、多くの繰り返しにつながります。
動き 'process.set(builder.start());'スレッド実装前後のAtomicReference 'プロセス=新しいAtomicReference <>();' –
Stephan
別のスレッドを使用するための唯一の理由がある場合プロセスの出力を消費するには、launchProcessメソッド全体を 'builder.inheritIO()。start();'に置き換えることができます。 – VGR