在假定終身運行的Java EE Web應用程序中使用Runtime
是個壞主意。
首先,由Runtime
創建的新進程將通過設計分配儘可能多的新堆內存作爲當前運行的Java環境。這可能並不一定會損害一個簡單的Java應用程序,該應用程序默認使用64MB或者其他東西,但是在Java EE Web應用程序中,通常以千兆字節分配內存,這將成爲完全的內存浪費。
其次,您只是不希望在Java EE Web應用程序中產生非託管進程/線程。如果進程/線程暫停和/或永遠運行,可能導致無法在必要時關閉/重新啓動Java EE Web應用程序(您需要首先完全終止它),該怎麼辦?如果該進程崩潰並將整個Java EE運行時間一起取下,該怎麼辦?
最後,您不能更改運行該進程的用戶。它將始終是執行當前正在運行的Java運行時的用戶。
你已經基本上2種選擇:
不要使用Java這個在所有。例如,只需使用平臺提供的後臺作業管理器來完成這項工作,例如基於Unix的平臺中的Cron和基於Windows的平臺中的任務計劃程序。
用100%Java做。使用純Java執行相同的目標,而不需要產生一個進程。您可以根據需要使用ExecutorService
API或第三方庫(如Quartz)管理後臺作業。請注意,即使這些作業仍需運行100%純Java代碼。
什麼是JEE版本?在JEE 6中,創建異步服務非常容易,使用EJB JEE 5您可以嘗試使用消息驅動bean。 – Thomas 2012-01-16 13:18:34
Thx Thomas。我不明白的是如何從一個Java世界的不同帳戶下啓動一個完全獨立的本地進程? – GaryX 2012-01-16 13:22:13
您可能需要http://docs.oracle.com/javase/7/docs/api/java/lang/Process.html。我不認爲你可以在JSP頁面上做很多事情,你至少需要一個servlet,但即使這樣也會存在安全限制。 – Viruzzo 2012-01-16 13:22:44