基本上ZeroMQ(java)中基本的代碼都算是過了一遍了吧,不過以爲它在日誌這一塊貌似基本沒有作什麼工做,也就是咱們經過日誌來知道ZeroMQ都發生了什麼事情。。java
並且因爲ZeroMQ中將鏈接的創建和重鏈接都進行了隔離,用戶不須要作什麼事情來維護鏈接,固然這樣作的好處是使程序員的編碼工做變少了,可是固然也有很差的地方,那就是用戶失去了對ZeroMQ整個運行階段的控制。。程序員
例如,當咱們主動去鏈接一個遠程地址,或者鏈接中斷以後,沒有日誌告訴咱們都這些事情發生了。。。當時對於一個消息通訊系統來講,這些日誌,或者說事件的監控都是相當重要的。socket
固然沒有日誌來記錄這些內容,並不表明咱們就沒法知道當前運行狀況都發生了什麼事情,ZeroMQ中採用了另一種方法來監控Socket的狀況,不過這種方法比較噁心,須要創建額外的Socket來監控本身感興趣的Socket。。。tcp
這裏先不說這些閒話了,來看看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; //全部的事件
上面是定義的全部可能發生的事件,具體每一種事件表明什麼意思後面的註釋都已經說明了,固然這裏面我以爲最重要的事件有鏈接的斷開,鏈接的創建,以及重鏈接等事件。。。url
接下來咱們來看看如何在ZeroMQ(java)中來監控這些事件吧,直接上代碼了:spa
- 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;
-
- import org.zeromq.ZMQ;
-
- 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來舉例子的,其實用起來還算是比較的簡單,當鏈接創建以後,將會輸出:.net
1 tcp://127.0.0.1:5000
日誌
1就是表明鏈接創建的事件,後面是創建鏈接的地址,code
這個時候若是關閉response,那麼將會輸出以下:
512 tcp://127.0.0.1:5000
512表明的就是鏈接斷開的事件。。。
嗯,至於說監控的源碼是怎麼實現的,這裏就不細說了,其實仍是很是的簡單的,若是有興趣能夠本身去看看。。
到此ZeroMQ(java)的代碼就算是讀的差很少了,算是告一段落吧,接下來好好看看書。。。另外有想 再搞搞C/C++方面的東西。。。初步計劃看看Redis的源碼吧。。。。