天天看點

ZeroMQ(java)中監控Socket

基本上ZeroMQ(java)中基本的代碼都算是過了一遍了吧,不過覺得它在日志這一塊貌似基本沒有做什麼工作,也就是我們通過日志來知道ZeroMQ都發生了什麼事情。。

而且由于ZeroMQ中将連接配接的建立和重連接配接都進行了隔離,使用者不需要做什麼事情來維護連接配接,當然這樣做的好處是使程式員的編碼工作變少了,但是當然也有不好的地方,那就是使用者失去了對ZeroMQ整個運作階段的控制。。

例如,當我們主動去連接配接一個遠端位址,或者連接配接中斷之後,沒有日志告訴我們都這些事情發生了。。。當時對于一個消息通信系統來說,這些日志,或者說事件的監控都是至關重要的。

當然沒有日志來記錄這些内容,并不代表我們就無法知道目前運作情況都發生了什麼事情,ZeroMQ中采用了另外一種方法來監控Socket的情況,不過這種方法比較惡心,需要建立額外的Socket來監控自己感興趣的Socket。。。

這裡先不說這些閑話了,來看看ZeroMQ中都定義了哪些監聽事件:

ZeroMQ(java)中監控Socket

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)中來監控這些事件吧,直接上代碼了:

ZeroMQ(java)中監控Socket

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的源碼吧。。。。

若轉載請注明出處!若有疑問,請回複交流!