2011-06-03 93 views
0

我有一個用groovy編寫的應用程序。它需要一些cmd參數並返回以前格式化的響應。隨着系統的發展,似乎需要非常頻繁地運行該應用程序(例如5分鐘內執行80次),這會導致某些性能問題。特別是它一遍又一遍地創建所有對象,一次運行就可以填充高達60MB的RAM(可以很容易地計算出ROM/swap的使用情況)。將應用程序遷移到服務模式[java/groovy]

我想將其遷移到服務運行模式,該模式將簡單地採用某些參數並返回格式化輸出。但是:

  1. 應用程序總是由一個BAT/sh腳本(這不能更改)
  2. 兩個腳本和應用程序都在同一臺主機服務器上

所以,我觸發想知道如何進行腳本和服務的交流會更好?

P.S .:對不起,我沒有提及,它是一個獨立的應用程序,它永遠不會使用服務器或類似的東西,因爲它似乎是多餘的。解決方案應該儘可能簡單並且非常輕便。例如:現在我能想到的最簡單的事情就是永遠不會遷移它(我知道它是矛盾的;)),並簡單地引入一個DB,其中所有結果將被存儲,並且應用程序將擁有它自己的時間表引起。每當用任何params觸發它時,它應該簡單地搜索DB中的最新結果並返回。輕鬆,輕鬆,快速和工作。 :)

回答

0

對於企業環境,我建議使用運行在應用程序服務器中的EJB的JavaEE應用程序。對於您的要求,這可能是一個矯枉過正的問題。一個簡單的解決方案可以是:

  • 服務:使用本地RMI註冊表實現RMI服務器。計算將在這裏完成。
  • 腳本:連接到RMI服務器,調用RMI服務器上的方法並顯示結果。

RMI服務器

public class RmiServer extends UnicastRemoteObject implements RmiInterface 
{ 
    private static final long serialVersionUID = 1L; 

    public RmiServer() throws RemoteException 
    { 
     super(); 
    } 

    public String random() throws RemoteException 
    { 
     return "Helo World! "+(new Random()).nextInt(100); 
    } 

    public static void main(String[] args) throws RemoteException, MalformedURLException 
    { 
     LocateRegistry.createRegistry(Registry.REGISTRY_PORT); 
     Naming.rebind("myServer", new RmiServer()); 
    } 
} 

RMI客戶

RmiInterface server = (RmiInterface)Naming.lookup("//127.0.0.1/myServer"); 
System.out.println(server.random()); 

RMI接口

public interface RmiInterface extends Remote 
{ 
    public String random() throws RemoteException; 
} 
+0

請參閱編輯P.S您的建議是好的,謝謝,但簡單的setDaemon和套接字構建完成相同和更容易。 – 2011-06-03 10:54:30

+0

這取決於您的方法和返回對象以及要調用的不同方法的數量。使用RMI,您可以直接調用遠程對象上的方法,並使用您可能需要的套接字來實現協議。 – Thor 2011-06-03 11:09:39

+0

@Thor,這個想法是,我從來沒有說過它會返回對象。它返回格式化文本。 – 2011-06-03 11:15:03

相關問題