快速而脏的解决方案,用于不同机器中的进程之间的通

时间:2009-01-14 16:07:10

标签: java windows process communication

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


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

9 个答案:

答案 0 :(得分:6)

java RMI(远程方法接口)

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

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而拥有)将被通知已发布的对象。

答案 3 :(得分:1)

你所描述的是快速(而不是那么快)和肮脏的方式。完成任务的唯一其他方法是设置通过套接字监听和发送数据的过程(直接由您实现 - 在java中它非常简单,只有Google,你会发现,或者作为库的一部分 - 可能需要更复杂的东西)

因此,每个进程都会在特定端口上有一个侦听器,并且经常会在该端口上发送数据。

答案 4 :(得分:1)

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

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

答案 5 :(得分:1)

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

答案 6 :(得分:0)

问题不明确。您在寻找要使用的API或库吗? 两台机器开始时是否知道对方的地址,或者他们是否需要相互发现?

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

答案 7 :(得分:0)

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

可能有工具可以使它工作,但我可以建议只打开一个简单的套接字吗?它们非常接近于使用。

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

答案 8 :(得分:0)

我完全同意GaryF Spring Remoting是最好的选择,它快速而干净。 如果你对Spring一点都不熟悉,那么一开始你可能需要一点时间。 但相信我完全值得。