2014-03-06 69 views
2

我一直使用ActiveMQ或RabbitMQ,但最近因爲注意力而開始挖掘ZeroMQ。如果我正在閱讀的內容是正確的,那麼它似乎是一個消息中介以及進程間通信機制(IPC)?兩個JVM進程可以使用ZeroMQ在同一臺機器上進行通信嗎?

我有一種情況,我有2個Java進程需要在同一臺機器上相互通信。我不想使用共享文件方法,因爲它們之間的對話/協議非常複雜,而且文件解決方案看起來很笨拙。

所以我要開始標題下使用類似的Netty或者MINA來定義自己的通訊協議,並讓他們交談了港口的公路,但後來我開始閱讀關於ZeroMQ,如果我能想知道完成同樣的工作,但工作量較少。

所以我問:ZeroMQ可以在Java進程之間用於IPC嗎?如果是的話,是否有任何具體的代碼示例或文章解釋瞭如何做到這一點?

+2

'零'意味着零經紀人。 ZeroMQ適用於基於消息的IPC,並且在他們的網站上有很多示例。 –

+1

感謝@Peter Lawrey(+1) - 但是如果你真的去了他們的網站,你會發現:(1)非Java語言中的大量例子,以及(2)Java例子中的所有例子在同一個JVM進程中的多個線程**之間進行通信**,而不是在2個JVM進程之間進行通信...... – AdjustingForInflation

+1

@PeterLawrey告訴你,我看不到任何與您的語句相矛盾的語句。 – EJP

回答

3

web site的前三行告訴你所有你需要知道的事情。

分佈式計算變得簡單

Ø套接字庫充當併發框架。
Ø通過inproc,IPC,TCP和組播傳送消息。

我沒有看到任何理由懷疑這不適用於環回,如果不能,它會非常棒。

2

是的,zmq可以用來連接兩個Java進程。您可以使用純Java實現JeroMq或ZeroMq與Java客戶端。 JeroMq更容易安裝,因爲您只需要適當的依賴關係。下面是簡單的例子爲聽衆:

import org.zeromq.ZMQ; 

public class Subscriber { 

    public static void main(String[] a){ 
     final ZMQ.Context ctx = ZMQ.context(1); 
     final ZMQ.Socket sub = ctx.socket(ZMQ.SUB); 
//  sub.connect("tcp://localhost:6001"); 
     sub.connect("ipc://001"); 
     sub.subscribe("".getBytes()); 

     while (true){ 
      String msg = sub.recvStr(); 
      System.out.println(msg); 
     } 
    } 
} 

和發行商:

import org.zeromq.ZMQ; 

public class Publisher { 

    public static void main(String[] a) throws InterruptedException { 
     final ZMQ.Context ctx = ZMQ.context(1); 
     final ZMQ.Socket pub = ctx.socket(ZMQ.PUB); 
     pub.bind("ipc://001"); 
//  pub.bind("tcp://*:6001"); 

     while (true){ 
      System.out.println("Publishing"); 
      pub.send("Test"); 
      Thread.sleep(1000); 
     } 
    } 
} 

IPC和TCP都工作。

相關問題