将应用程序迁移到服务模式[java/groovy]

将应用程序迁移到服务模式[java/groovy],java,service,groovy,communication,Java,Service,Groovy,Communication,我有一个用groovy编写的应用程序。它接受一些cmd参数并返回以前格式化的响应。随着系统的发展,似乎需要非常频繁地运行此应用程序(如5分钟内运行80次),这会导致某些性能问题。特别是,它一次又一次地创建其所有对象,这导致在一次运行中填充高达60MB的RAM(可以很容易地计算出ROM/swap使用的严重程度) 我想将其迁移到服务运行模式,该模式将只接受某些参数并返回格式化的输出。但是: 应用程序总是由bat/sh脚本触发(无法更改) 脚本和应用程序都位于同一主机服务器上 所以,我想知道如何更好地

我有一个用groovy编写的应用程序。它接受一些cmd参数并返回以前格式化的响应。随着系统的发展,似乎需要非常频繁地运行此应用程序(如5分钟内运行80次),这会导致某些性能问题。特别是,它一次又一次地创建其所有对象,这导致在一次运行中填充高达60MB的RAM(可以很容易地计算出ROM/swap使用的严重程度)

我想将其迁移到服务运行模式,该模式将只接受某些参数并返回格式化的输出。但是:

  • 应用程序总是由bat/sh脚本触发(无法更改)
  • 脚本和应用程序都位于同一主机服务器上
  • 所以,我想知道如何更好地执行脚本和服务的通信

    注:很抱歉我没有提到,这是一个独立的应用程序,它永远不会使用服务器或类似的东西,因为它看起来是多余的。解决方案应该尽可能简单,并且非常轻量级


    示例:到目前为止,我能想到的最简单的事情就是永远不要迁移它(我知道这是矛盾的;),只需引入一个数据库,所有的电子结果都将存储在其中,应用程序将有自己的触发时间表。无论何时使用任何参数触发它,它都应该在DB中搜索最新的结果并返回它。简单、轻便、快速且可工作。:)

    对于企业环境,我建议使用在应用服务器中运行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;
    }
    

    请参阅已编辑的P.S.。您的建议很好,谢谢,但简单的setDaemon和套接字构建也可以做到这一点,而且更简单。这取决于您的方法和返回对象,以及要调用的不同方法的数量。使用RMI,您可以直接调用远程对象上的方法,使用套接字,您可能需要实现协议。@Thor,我的想法是,我从来没有说过它返回对象。它返回格式化文本。@den javamaniac Ok,但即使这是
    java.lang.String
    列表
    ;-)试一试,我用一个RMI的工作示例扩展了我的答案。@Thor。好,让我们继续:如何从脚本连接到RMI?正如我之前写的,这个应用程序总是由一个bat/sh脚本触发的(这是不能更改的),所以要做到这一点,我需要一个单独的应用程序来运行。因此,在本地主机上运行的两个应用程序建立了RMI。我不明白为什么我会放弃一个插座的想法D