【问题标题】:Migrating an application to a service mode [java/groovy]将应用程序迁移到服务模式 [java/groovy]
【发布时间】:2011-06-03 09:17:37
【问题描述】:

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

我想将它迁移到服务运行模式,该模式将简单地采用某些参数并返回格式化输出。但是:

  1. 应用程序始终由 bat/sh 脚本触发(无法更改)
  2. 脚本和应用都在同一个主机服务器上

那么,我想知道如何更好地执行脚本和服务的通信?

P.S.:对不起,我没有提到,它是一个独立的应用程序,它永远不会使用服务器或类似的东西,因为它似乎是多余的。解决方案应尽可能简单且极其轻量。

示例:我现在能想到的最简单的事情就是永远不要迁移它(我知道这很矛盾;))并简单地引入一个数据库来存储所有结果,并且应用程序将有自己的时间表扳机。每当它被任何参数触发时,它都应该简单地在数据库中搜索最新的结果并返回它。简单、轻便、快速且有效。 :)

【问题讨论】:

    标签: java service groovy communication


    【解决方案1】:

    对于企业环境,我建议在应用服务器中运行带有 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 好的,但即使这是 java.lang.StringList<String> ;-) 试一试,我用 RMI 的工作示例扩展了我的答案。
    • @Thor。好的,让我们继续:如何从脚本连接到 RMI?正如我之前写的,App 总是由 bat/sh 脚本触发(这是无法更改的),所以要做到这一点,我需要一个单独的应用程序来运行。所以它是在本地主机上运行的两个应用程序建立 RMI。不明白为什么我会放弃套接字的想法。 :D
    猜你喜欢
    • 1970-01-01
    • 2023-04-04
    • 2013-08-06
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 2011-04-08
    相关资源
    最近更新 更多