2011-06-03 96 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

相关问题