2012-12-10 24 views
1

我想從java應用程序執行外部jar。優雅的方式來檢查外部長期jar是否成功啓動

什麼是最優雅的方式來檢查,如果該過程已成功運行開始了嗎?

ExtApp.jar是長期運行的過程,所以我不能使用Process.waiFor(),因爲它會阻止我的應用程序。我想出了以下代碼,後面的想法是exitValue()拋出IllegalThreadStateException如果進程尚未終止。

boolean success = false; 
try { 
    Process process = Runtime.getRuntime().exec("java -jar ExtApp.jar"); 
    try { 
     if (process.exitValue() == 0) 
      success = true; 
    } catch (IllegalThreadStateException e) { 
     success = true; 
    } 
} catch (Exception e) {} 

System.out.println(success); 

但它是一種醜陋的解決方案。任何更好的想法?

回答

2

似乎沒有優雅的解決方案的問題。例如。我在PC上運行你的代碼,並獲得「成功」,雖然沒有ExtApp.jar。也就是說,從Runtime.exec的角度來看,進程(java.exe)成功啓動,無論之後發生了什麼。

+0

你說得對。有一個計時問題。如果使用調試器檢查代碼並且ExtApp.jar不存在,則顯示「false」,如果不是從調試器運行,則顯示爲「true」。 –

+0

對,這就是我的意思,時間和時間並不高雅,因爲在做出決定之前你永遠不知道要等多久 –

2

上面看起來很可疑。您將生成您的流程,然後立即進行測試。這個過程本身可能沒有確定它是否運行正常或不(例如,當它實際上檢查jar文件eixsts /可加載/是有效的嗎?)

我認爲你最好通過一個新的線程產卵的過程,呼籲/通過Process.waitFor()阻止在該線程,然後通知父線程(通過一切手段 - 狀態變量,wait()/notify(),一個java.util.concurrent.Future等),一旦這個過程已經退出,你已經收集到的退出狀態。

Apache Commons Exec是做這樣的工作,包括進程退出的異步產卵/通知有用的庫。有關更多信息,請參閱DefaultExecuteResultHandler

+0

這是一個長期的過程,它不會退出。 –

相關問題