2010-01-28 21 views

回答

0

從Java EE容器生成進程可能不是正確的方法。 如果這些是shell腳本,它們將不可移植。 如果要使用事務支持,則可以使用Quartz Scheduler將腳本重寫爲作業。 這很可能是Java EE做這種事情的方式。

編輯:隨着在評論中添加你的要求,這應該工作

Process process = new ProcessBuilder(command).start(); 

更多細節here

請注意,如果您使用腳本和/或管道(沒有本地可執行文件)必須包括shell來調用命令(和設置管道)

+0

目前我們的應用程序是一個Eclipse插件,它爲很少的功能使用了很多Unix腳本。我們的目標是使它成爲一個基於Web的應用程序,我們希望重用相同的Unix腳本。 我的想法是從App服務器調用這些unix腳本。你能建議一個更好的方法來做到這一點? – 2010-01-28 16:15:06

0

您將遇到的最大問題是,如果您的應用服務器內存映像很大,當您分叉運行腳本時,您可能會耗盡內存並導致分支失敗。當您分叉時,系統需要製作可執行映像的完整副本。它不會生成物理副本,但它確實需要創建一個虛擬副本。所以,如果你有一個大的Java EE堆,比如4G的真實內存(即不只是Java堆,總進程大小),那麼你需要一個額外的「免費」4G真正的RAM和/或交換叉足夠虛擬空間發生。

是的,你會立即執行exec或其他一些不會吸收gazillion資源的命令。但系統無法知道這一點,因此它需要採取行動,好像它將不得不一次運行兩個Java EE容器副本,即使是納秒級。

如果您沒有fork的資源,則fork失敗。

如果你綁在空間上,你可以做的是創建一個小型的微型exec啓動守護進程。然後,而不是您的Java EE應用程序分叉進程,您只需打開一個套接字到您的守護進程,並且IT分叉進程。很顯然,期望這個小守護程序比你的容器消耗的資源要少得多,所以它很便宜。

守護進程可以像使用命令行在套接字上執行一樣簡單,只是通過命令代碼和一些參數來執行它獲取的內容(可能不安全,當然,但是...)或簡單的rpc。什麼適合您的項目。你可以用Java,一種腳本語言(Python,Perl,Ruby)來編寫它,不管。很多方法可以做到這一點。

0

一種可能性是編寫一個監聽JMS隊列並調用腳本的小應用程序。這樣,腳本執行就與應用程序服務器分開,所以不會遇到任何規範限制。

相關問題