我的網絡中有兩臺機器用java編寫的兩個進程,它們應該可以將簡單的數據塊傳遞給對方。
快速和骯髒的解決方案,用於不同機器中的進程之間的通信
我正在尋找一個快速和骯髒的方式(而不是訴諸寫入文件和投票的網絡共享文件的更改)
我的網絡中有兩臺機器用java編寫的兩個進程,它們應該可以將簡單的數據塊傳遞給對方。
快速和骯髒的解決方案,用於不同機器中的進程之間的通信
我正在尋找一個快速和骯髒的方式(而不是訴諸寫入文件和投票的網絡共享文件的更改)
的問題是不明確的。你正在尋找一個API或庫來使用? 兩臺機器是否知道彼此的地址,或者他們需要發現彼此?
您可以將JMS用於大多數通信,但所有機器必須熟悉單獨運行的「代理程序」。
的Java RMI(遠程方法接口)
你所描述什麼是快速(而不是真的那麼快)和骯髒的方式。完成任務的唯一其他方法是設置進程來通過套接字來監聽和發送數據(可以直接由你實現 - 在java中它很容易,只是Google,你會發現,或者作爲庫的一部分) - 可能需要更復雜的任何東西)
因此,每個進程都會在特定的端口上有一個偵聽器,並且每隔一段時間都會通過該端口發送數據。
假設機器有對方的地址(得到的地址是不同的問題),我認爲你最好的選擇是Spring remoting。你有一個數據傳遞接口,一個封裝你想傳遞的數據的域對象,以及一個在每一邊實現這個接口的遠程服務。之後,您的代碼將遠程服務視爲另一個協作者。便宜,簡單,快捷,你可以使用任何你喜歡的傳輸(RMI,HTTP,Hessian,Burlap等)。
通常需要大約10分鐘(最多)才能將現有接口/服務作爲遠程服務公開,但第一次需要更長的時間。
我將第二個想法是讓你的進程通過套接字進行通信,並提到Apache的MINA包使得這類事情非常簡單,健壯,並且可擴展,而沒有像RMI或JMS這樣的更大系統的開銷。它還包含對編碼和解碼消息的良好支持。我在中型系統中使用得非常成功。
這種溝通往往很容易抽象。無論您是否使用MINA,一旦您設置了處理建立/拆除連接並在連接中移動數據的課程,它們可能具有高度可重用性。
我覺得RMI有點煩人。您必須爲單個遠程對象定義3個文件,並且如果您尚不知道如何使用它(我相信有一個獨立的編譯器步驟),您必須學習正常開發過程之外的東西。
可能有工具可以使它工作,但我可能會建議打開一個簡單的套接字?他們非常接近使用微不足道。
唯一需要注意的是,您應該小心定義計算機之間的流程。
通過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)將被通知的已發佈對象。
我完全同意GaryF Spring Remoting是最好的選擇,它是快速和乾淨的。 如果你對Spring一點都不熟悉,它可能會讓你花一點時間。 但相信我完全值得。
你可能會發現Terracotta是一個非常簡單的方法來做到這一點。兵馬俑允許你聚集你的堆的一部分(例如,一個HashMap),並在所有節點上看到該地圖的內容。設置這是相當微不足道的。
你不需要JNDI設置嗎?幾乎看起來很快和骯髒。 – 2009-01-14 16:17:57
它比插座好。如果您不想寫入共享文件系統,那麼還有什麼其他選擇? – 2009-01-14 17:46:45