5

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


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

4

9 回答 9

6

java RMI(远程方法接口)

于 2009-01-14T16:09:30.753 回答
2

ActiveMQ Broker 上的 JMS 非常简单。它在这里可用。以下是发送消息的快速而肮脏的伪代码,但您可以看到它的最小代码。考虑两个 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)将收到已发布对象的通知。

于 2009-01-14T20:35:37.267 回答
2

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

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

于 2009-01-14T16:11:47.737 回答
1

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

于 2009-01-15T04:07:46.403 回答
1

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

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

于 2009-01-14T16:16:00.113 回答
1

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

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

于 2009-01-14T16:11:15.990 回答
0

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

于 2009-01-14T20:48:34.807 回答
0

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

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

于 2009-01-14T16:08:56.073 回答
0

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

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

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

于 2009-01-14T17:42:08.507 回答