我有以下的集成測試代碼,我開始各種服務,然後測試才能運行:的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,但我process.get()
總是返回null
。我究竟做錯了什麼?如何使用上述方法獲得對已啓動流程的引用?如果我在setup()
函數本身設置了進程,即process = builder.start()
,那麼它可以正常工作。但是,這也導致了很多重複,因爲我需要在單獨的JVM中啓動許多單獨的服務。
移動'process.set(builder.start());'線程執行之前和之後'的AtomicReference過程=新的AtomicReference <>();' –
Stephan
如果使用一個單獨的線程唯一原因是要使用進程的輸出,可以用'builder.inheritIO()。start();'替換整個launchProcess方法。 – VGR