【问题标题】:Quick and dirty solution for communication between processes in different machines [closed]用于不同机器中进程之间通信的快速而肮脏的解决方案[关闭]
【发布时间】:2009-01-14 16:07:09
【问题描述】:

我的网络中的两台机器上有两个用 java 编写的进程,它们应该相互传递简单的数据块。


我正在寻找一种快速而肮脏的方式(不求助于写入文件和轮询网络共享文件的更改)

【问题讨论】:

    标签: java windows process communication


    【解决方案1】:

    javaRMI(远程方法接口)

    【讨论】:

    • 你不需要JNDI设置吗?几乎不像是又快又脏。
    • 它比套接字更好。如果您不想写入共享文件系统,那么还有什么其他选择?
    • JMS、Terracotta、Spring Remoting、HTTP、XMPP,除了 RMI。耶。
    【解决方案2】:

    假设机器有彼此的地址(获取所说的地址是一个不同的问题),我认为你最好的选择是Spring remoting。您有一个数据传递接口、一个封装您要传递的数据的域对象,以及一个在每一端实现该接口的远程服务。之后,您的代码将远程服务视为另一个协作者。便宜、简单、快速,而且您可以使用任何您喜欢的传输方式(RMI、HTTP、Hessian、Burlap 等)。

    我通常需要大约 10 分钟(最多)将现有的接口/服务公开为远程服务,但第一次需要更长的时间。

    【讨论】:

      【解决方案3】:

      ActiveMQ Broker 上的 JMS 非常简单。它可用here。以下是发送消息的快速而肮脏的伪代码,但您可以看到它的最小代码。考虑两个 Java 应用程序,一个发布者和一个订阅者。

      1. 在您的一个发布者中创建代理:

        BrokerService broker = new BrokerService();    
        broker.addConnector("tcp://localhost:61616");    
        broker.setPersistent(false);    
        broker.start();
        
      2. 在两个应用程序中设置连接(注意:订阅者将本地主机替换为运行代理的机器的地址):

        final ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616");    
        TopicConnection connection = factory.createTopicConnection();    
        Session session = connection.createSession(false,Session.DUPS_OK_ACKNOWLEDGE);    
        
      3. 在发布应用中发送数据:

        Topic topic = session.createTopic("Quick and dirty topic");
        MessageProducer producer = session.createProducer(topic);    
        ObjectMessage message = session.createObjectMessage();    
        message.setObject((Serializable) "Object you want to send");    
        producer.send(message);
        
      4. 在您订阅应用程序(必须实现 javax.jms.MessageListener)中,需要以下设置:

        Destination dest = session.createTopic("Quick and dirty topic");    
        MessageConsumer consumer = session.createConsumer(dest);    
        consumer.setMessageListener(this);
        
      5. 订阅应用的onMessage(Message arg0) 方法(因为它是一个MessageListener)将收到已发布对象的通知。

      【讨论】:

        【解决方案4】:

        您所描述的是快速(并不是真的那么快)和肮脏的方式。完成任务的唯一其他方法是设置进程以通过套接字侦听和发送数据(由您直接实现 - 在 java 中这很容易,只需谷歌,您会发现,或者作为库的一部分 - 可能需要更复杂的东西)

        因此,每个进程都会在特定端口上拥有一个侦听器,并且每隔一段时间就会通过该端口发送数据。

        【讨论】:

          【解决方案5】:

          我将支持让您的进程通过套接字进行通信的想法,并提到 Apache 的 MINA 包使这种事情变得非常简单和健壮,并且具有可扩展性,而无需像 RMI 或JMS。它还包含对编码和解码消息的一些很好的支持。我在一个中等规模的系统中使用得非常成功。

          这种交流也很容易抽象。无论您是否使用 MINA,一旦您设置了类来处理建立/拆除连接和跨连接移动数据,它们可能会高度可重用。

          【讨论】:

            【解决方案6】:

            您可能会发现Terracotta 是一种非常简单的方法。 Terracotta 允许您聚集堆的一部分(例如,HashMap)并在所有节点上查看该映射的内容。设置它相当简单。

            【讨论】:

              【解决方案7】:

              问题不清楚。您是否正在寻找要使用的 API 或库? 两台机器一开始就知道彼此的地址,还是需要互相发现?

              您可以将 JMS 用于大多数通信,但所有机器都必须熟悉单独运行的“代理进程”。

              【讨论】:

                【解决方案8】:

                我发现 RMI 有点烦人。您必须为单个远程对象定义 3 个文件,并且如果您还不知道如何使用它,则必须学习正常开发过程之外的东西(我相信这涉及到一个单独的编译器步骤)。

                可能有一些工具可以让它工作,但我可以建议只打开一个简单的套接字吗?它们使用起来几乎是微不足道的。

                唯一需要注意的是,您应该小心定义计算机之间的流量。

                【讨论】:

                • stubs/skels 以及 rmic 在 java 5 出现时消失了
                • 我在考虑本地和远程接口以及本地和远程对象的实际类定义只是为了传递一个字符串,但很高兴知道远程编译步骤已经消失了,也许我再试一次。
                • ahhhhh ...是的,那些对象。我发现 Proxy 类结合一些仔细的反射可以抽象出一些痛苦的调用。为您的远程接口创建一个代理并将调用委托给真实对象。无缝。
                【解决方案9】:

                我完全同意 GaryF Spring Remoting 是最好的选择,它既快速又干净。 如果您对 Spring 完全不熟悉,一开始可能会花一些时间。 但相信我,这完全值得。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2010-10-08
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多