【发布时间】:2009-01-14 16:07:09
【问题描述】:
我的网络中的两台机器上有两个用 java 编写的进程,它们应该相互传递简单的数据块。
我正在寻找一种快速而肮脏的方式(不求助于写入文件和轮询网络共享文件的更改)
【问题讨论】:
标签: java windows process communication
我的网络中的两台机器上有两个用 java 编写的进程,它们应该相互传递简单的数据块。
我正在寻找一种快速而肮脏的方式(不求助于写入文件和轮询网络共享文件的更改)
【问题讨论】:
标签: java windows process communication
javaRMI(远程方法接口)
【讨论】:
假设机器有彼此的地址(获取所说的地址是一个不同的问题),我认为你最好的选择是Spring remoting。您有一个数据传递接口、一个封装您要传递的数据的域对象,以及一个在每一端实现该接口的远程服务。之后,您的代码将远程服务视为另一个协作者。便宜、简单、快速,而且您可以使用任何您喜欢的传输方式(RMI、HTTP、Hessian、Burlap 等)。
我通常需要大约 10 分钟(最多)将现有的接口/服务公开为远程服务,但第一次需要更长的时间。
【讨论】:
ActiveMQ Broker 上的 JMS 非常简单。它可用here。以下是发送消息的快速而肮脏的伪代码,但您可以看到它的最小代码。考虑两个 Java 应用程序,一个发布者和一个订阅者。
在您的一个发布者中创建代理:
BrokerService broker = new BrokerService();
broker.addConnector("tcp://localhost:61616");
broker.setPersistent(false);
broker.start();
在两个应用程序中设置连接(注意:订阅者将本地主机替换为运行代理的机器的地址):
final ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616");
TopicConnection connection = factory.createTopicConnection();
Session session = connection.createSession(false,Session.DUPS_OK_ACKNOWLEDGE);
在发布应用中发送数据:
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);
在您订阅应用程序(必须实现 javax.jms.MessageListener)中,需要以下设置:
Destination dest = session.createTopic("Quick and dirty topic");
MessageConsumer consumer = session.createConsumer(dest);
consumer.setMessageListener(this);
订阅应用的onMessage(Message arg0) 方法(因为它是一个MessageListener)将收到已发布对象的通知。
【讨论】:
您所描述的是快速(并不是真的那么快)和肮脏的方式。完成任务的唯一其他方法是设置进程以通过套接字侦听和发送数据(由您直接实现 - 在 java 中这很容易,只需谷歌,您会发现,或者作为库的一部分 - 可能需要更复杂的东西)
因此,每个进程都会在特定端口上拥有一个侦听器,并且每隔一段时间就会通过该端口发送数据。
【讨论】:
我将支持让您的进程通过套接字进行通信的想法,并提到 Apache 的 MINA 包使这种事情变得非常简单和健壮,并且具有可扩展性,而无需像 RMI 或JMS。它还包含对编码和解码消息的一些很好的支持。我在一个中等规模的系统中使用得非常成功。
这种交流也很容易抽象。无论您是否使用 MINA,一旦您设置了类来处理建立/拆除连接和跨连接移动数据,它们可能会高度可重用。
【讨论】:
您可能会发现Terracotta 是一种非常简单的方法。 Terracotta 允许您聚集堆的一部分(例如,HashMap)并在所有节点上查看该映射的内容。设置它相当简单。
【讨论】:
问题不清楚。您是否正在寻找要使用的 API 或库? 两台机器一开始就知道彼此的地址,还是需要互相发现?
您可以将 JMS 用于大多数通信,但所有机器都必须熟悉单独运行的“代理进程”。
【讨论】:
我发现 RMI 有点烦人。您必须为单个远程对象定义 3 个文件,并且如果您还不知道如何使用它,则必须学习正常开发过程之外的东西(我相信这涉及到一个单独的编译器步骤)。
可能有一些工具可以让它工作,但我可以建议只打开一个简单的套接字吗?它们使用起来几乎是微不足道的。
唯一需要注意的是,您应该小心定义计算机之间的流量。
【讨论】:
我完全同意 GaryF Spring Remoting 是最好的选择,它既快速又干净。 如果您对 Spring 完全不熟悉,一开始可能会花一些时间。 但相信我,这完全值得。
【讨论】: