我在网络中的两台机器上用java编写了两个进程,它们应该将简单的数据块相互传递。
我正在寻找一种快速而肮脏的方式(无需借助于编写文件和轮询网络共享文件的更改)
答案 0 :(得分:6)
java RMI(远程方法接口)
答案 1 :(得分:2)
假设机器有彼此的地址(获得所述地址是一个不同的问题),我认为你最好的选择是Spring remoting。您有一个数据传递接口,一个封装您想要传递的数据的域对象,以及一个在每一侧实现该接口的远程服务。之后,您的代码将远程服务视为另一个协作者。便宜,简单,快捷,您可以使用任何您喜欢的传输(RMI,HTTP,Hessian,Burlap等)。
通常需要大约10分钟(最多)将现有接口/服务作为远程服务公开,但第一次会花费更长的时间。
答案 2 :(得分:2)
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而拥有)将被通知已发布的对象。
答案 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一点都不熟悉,那么一开始你可能需要一点时间。 但相信我完全值得。