2013-10-09 103 views
0

我們從一個Servlet啓動一個外部進程。Servlet啓動外部進程

try { 
    Process proc = Runtime.getRuntime().exec("java -jar " + jarLocation); 
  • 該servlet並用相同的用戶ID /密碼的外部進程訪問相同的數據庫。

  • 該小服務器確實不等待爲外部過程完成。

  • 該servlet在不到一秒內完成其「處理」。

  • 從Servlet啓動時,外部應用程序至少需要兩分鐘才能完成。

  • 當在獨立模式下運行外部應用程序大約需要5秒鐘才能完成。

我們嘗試在外部進程啓動後停止Web應用程序,這導致外部進程立即完成。

因此,Servlet和外部進程之間似乎存在某種相互作用,導致進程花費很長時間才能完成。我們一直在試圖弄清楚幾天內會發生什麼,並且已經無處可逃。

有沒有人知道這裏會發生什麼?

+0

布賴恩,感謝您的回覆。捕獲流程輸出是所有工作都需要的。 – user903724

回答

2

您需要在servlet進程中使用衍生進程的stdout/stderr。

否則生成的進程可能會阻止等待它被使用。這樣做有一點複雜 - 請參閱this answer及其linked article瞭解更多信息。

請注意,您應該執行Process.waitFor()來收集產生的進程退出代碼。否則,你的手上會有一個殭屍。因此,你可能想將所有這些包裝在一個單獨的線程中,這樣你的servlet就可以產生進程並立即返回。儘管如此,如果你啓動了一個新的Java進程,你不能簡單地重構它,這樣你就可以在同一個JVM中把它稱爲庫函數嗎?產卵過程是一個相對重的和耗時的任務。

相關問題