基本上ZeroMQ(java)中基本的代碼都算是過了一遍了吧,不過覺得它在日志這一塊貌似基本沒有做什麼工作,也就是我們通過日志來知道ZeroMQ都發生了什麼事情。。
而且由于ZeroMQ中将連接配接的建立和重連接配接都進行了隔離,使用者不需要做什麼事情來維護連接配接,當然這樣做的好處是使程式員的編碼工作變少了,但是當然也有不好的地方,那就是使用者失去了對ZeroMQ整個運作階段的控制。。
例如,當我們主動去連接配接一個遠端位址,或者連接配接中斷之後,沒有日志告訴我們都這些事情發生了。。。當時對于一個消息通信系統來說,這些日志,或者說事件的監控都是至關重要的。
當然沒有日志來記錄這些内容,并不代表我們就無法知道目前運作情況都發生了什麼事情,ZeroMQ中采用了另外一種方法來監控Socket的情況,不過這種方法比較惡心,需要建立額外的Socket來監控自己感興趣的Socket。。。
這裡先不說這些閑話了,來看看ZeroMQ中都定義了哪些監聽事件:

public static final int EVENT_CONNECTED = zmq.ZMQ.ZMQ_EVENT_CONNECTED; //當主動建立連接配接建立成功之後的事件
public static final int EVENT_DELAYED = zmq.ZMQ.ZMQ_EVENT_CONNECT_DELAYED; //連接配接延遲
public static final int EVENT_RETRIED = zmq.ZMQ.ZMQ_EVENT_CONNECT_RETRIED; //嘗試重新連接配接
public static final int EVENT_CONNECT_FAILED = zmq.ZMQ.ZMQ_EVENT_CONNECT_FAILED; //連接配接失敗
public static final int EVENT_LISTENING = zmq.ZMQ.ZMQ_EVENT_LISTENING; //建立了監聽
public static final int EVENT_BIND_FAILED = zmq.ZMQ.ZMQ_EVENT_BIND_FAILED; //bind失敗
public static final int EVENT_ACCEPTED = zmq.ZMQ.ZMQ_EVENT_ACCEPTED; //接收到accept事件
public static final int EVENT_ACCEPT_FAILED = zmq.ZMQ.ZMQ_EVENT_ACCEPT_FAILED; //accept出錯的事件
public static final int EVENT_CLOSED = zmq.ZMQ.ZMQ_EVENT_CLOSED; //關閉事件
public static final int EVENT_CLOSE_FAILED = zmq.ZMQ.ZMQ_EVENT_CLOSE_FAILED; //關閉失敗
public static final int EVENT_DISCONNECTED = zmq.ZMQ.ZMQ_EVENT_DISCONNECTED; //連接配接斷開
public static final int EVENT_ALL = zmq.ZMQ.ZMQ_EVENT_ALL; //所有的事件
上面是定義的所有可能發生的事件,具體每一種事件代表什麼意思後面的注釋都已經說明了,當然這裡面我覺得最重要的事件有連接配接的斷開,連接配接的建立,以及重連接配接等事件。。。
接下來我們來看看如何在ZeroMQ(java)中來監控這些事件吧,直接上代碼了:

import org.zeromq.ZMQ;
import zmq.ZMQ.Event;
public class Request {
public static void main (String args[]) {
ZMQ.Context context = ZMQ.context(1);
ZMQ.Socket req = context.socket(ZMQ.REQ);
req.monitor("inproc://reqmoniter", ZMQ.EVENT_CONNECTED | ZMQ.EVENT_DISCONNECTED); //這段代碼會建立一個pair類型的socket,專門來接收目前socket發生的事件
final ZMQ.Socket moniter = context.socket(ZMQ.PAIR); //這裡建立一個pair類型的socket,用于與上面建立的moniter建立連接配接
moniter.connect("inproc://reqmoniter"); //連接配接目前socket的監聽
new Thread(new Runnable(){
public void run() {
// TODO Auto-generated method stub
while (true) {
Event event = Event.read(moniter.base()); //從目前moniter裡面讀取event
System.out.println(event.event + " " + event.addr);
}
}
}).start();
req.connect("tcp://127.0.0.1:5000");
while (true) {
req.send("aaa");
req.recv();
}
}
}
package monit;
public class Response {
public static void main(String args[]) {
final ZMQ.Context context = ZMQ.context(1);
ZMQ.Socket response = context.socket(ZMQ.REP);
response.bind("tcp://*:5000");
while (!Thread.currentThread().isInterrupted()) {
response.recv();
response.send("hello".getBytes());
try {
Thread.currentThread().sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
response.close();
context.term();
這裡代碼用req/rep來舉例子的,其實用起來還算是比較的簡單,當連接配接建立之後,将會輸出:
1 tcp://127.0.0.1:5000
1就是代表連接配接建立的事件,後面是建立連接配接的位址,
這個時候如果關閉response,那麼将會輸出如下:
512 tcp://127.0.0.1:5000
512代表的就是連接配接斷開的事件。。。
嗯,至于說監控的源碼是怎麼實作的,這裡就不細說了,其實還是非常的簡單的,如果有興趣可以自己去看看。。
到此ZeroMQ(java)的代碼就算是讀的差不多了,算是告一段落吧,接下來好好看看書。。。另外有想 再搞搞C/C++方面的東西。。。初步計劃看看Redis的源碼吧。。。。
若轉載請注明出處!若有疑問,請回複交流!