ZeroMQ(java)中監控Socket

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

並且因爲ZeroMQ中將鏈接的創建和重鏈接都進行了隔離,用戶不須要作什麼事情來維護鏈接,固然這樣作的好處是使程序員的編碼工做變少了,可是固然也有很差的地方,那就是用戶失去了對ZeroMQ整個運行階段的控制。。程序員

例如,當咱們主動去鏈接一個遠程地址,或者鏈接中斷以後,沒有日誌告訴咱們都這些事情發生了。。。當時對於一個消息通訊系統來講,這些日誌,或者說事件的監控都是相當重要的。socket

固然沒有日誌來記錄這些內容,並不表明咱們就沒法知道當前運行狀況都發生了什麼事情,ZeroMQ中採用了另一種方法來監控Socket的狀況,不過這種方法比較噁心,須要創建額外的Socket來監控本身感興趣的Socket。。。tcp

這裏先不說這些閒話了,來看看ZeroMQ中都定義了哪些監聽事件:編碼

[java]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
  1. public static final int EVENT_CONNECTED = zmq.ZMQ.ZMQ_EVENT_CONNECTED;   //當主動創建鏈接創建成功以後的事件  
  2. public static final int EVENT_DELAYED = zmq.ZMQ.ZMQ_EVENT_CONNECT_DELAYED;   //鏈接延遲  
  3. public static final int EVENT_RETRIED = zmq.ZMQ.ZMQ_EVENT_CONNECT_RETRIED;    //嘗試從新鏈接  
  4. public static final int EVENT_CONNECT_FAILED = zmq.ZMQ.ZMQ_EVENT_CONNECT_FAILED;   //鏈接失敗  
  5.   
  6. public static final int EVENT_LISTENING = zmq.ZMQ.ZMQ_EVENT_LISTENING;    //創建了監聽  
  7. public static final int EVENT_BIND_FAILED = zmq.ZMQ.ZMQ_EVENT_BIND_FAILED;  //bind失敗  
  8.   
  9. public static final int EVENT_ACCEPTED = zmq.ZMQ.ZMQ_EVENT_ACCEPTED;   //接收到accept事件  
  10. public static final int EVENT_ACCEPT_FAILED = zmq.ZMQ.ZMQ_EVENT_ACCEPT_FAILED;   //accept出錯的事件  
  11.   
  12. public static final int EVENT_CLOSED = zmq.ZMQ.ZMQ_EVENT_CLOSED;   //關閉事件  
  13. public static final int EVENT_CLOSE_FAILED = zmq.ZMQ.ZMQ_EVENT_CLOSE_FAILED;     //關閉失敗  
  14. public static final int EVENT_DISCONNECTED = zmq.ZMQ.ZMQ_EVENT_DISCONNECTED;   //鏈接斷開  
  15.   
  16. public static final int EVENT_ALL = zmq.ZMQ.ZMQ_EVENT_ALL;   //全部的事件  

上面是定義的全部可能發生的事件,具體每一種事件表明什麼意思後面的註釋都已經說明了,固然這裏面我以爲最重要的事件有鏈接的斷開,鏈接的創建,以及重鏈接等事件。。。url

接下來咱們來看看如何在ZeroMQ(java)中來監控這些事件吧,直接上代碼了:spa

[java]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
  1. import org.zeromq.ZMQ;  
  2.   
  3. import zmq.ZMQ.Event;  
  4.   
  5. public class Request {  
  6.     public static void main (String args[]) {  
  7.         ZMQ.Context context = ZMQ.context(1);  
  8.         ZMQ.Socket req = context.socket(ZMQ.REQ);  
  9.           
  10.         req.monitor("inproc://reqmoniter", ZMQ.EVENT_CONNECTED | ZMQ.EVENT_DISCONNECTED);  //這段代碼會建立一個pair類型的socket,專門來接收當前socket發生的事件  
  11.           
  12.         final ZMQ.Socket moniter = context.socket(ZMQ.PAIR);   //這裏建立一個pair類型的socket,用於與上面創建的moniter創建鏈接  
  13.         moniter.connect("inproc://reqmoniter");  //鏈接當前socket的監聽  
  14.           
  15.         new Thread(new Runnable(){  
  16.   
  17.             public void run() {  
  18.                 // TODO Auto-generated method stub  
  19.                 while (true) {  
  20.                     Event event = Event.read(moniter.base());  //從當前moniter裏面讀取event  
  21.                     System.out.println(event.event +  "  " + event.addr);  
  22.                 }  
  23.             }  
  24.               
  25.         }).start();  
  26.           
  27.         req.connect("tcp://127.0.0.1:5000");  
  28.           
  29.         while (true) {  
  30.             req.send("aaa");  
  31.             req.recv();  
  32.         }  
  33.           
  34.           
  35.     }  
  36. }  
  37.   
  38. package monit;  
  39.   
  40. import org.zeromq.ZMQ;  
  41.   
  42. public class Response {  
  43.     public static void main(String args[]) {  
  44.         final ZMQ.Context context = ZMQ.context(1);  
  45.           
  46.   
  47.       
  48.         ZMQ.Socket response = context.socket(ZMQ.REP);  
  49.         response.bind("tcp://*:5000");  
  50.         while (!Thread.currentThread().isInterrupted()) {  
  51.             response.recv();  
  52.             response.send("hello".getBytes());  
  53.             try {  
  54.                 Thread.currentThread().sleep(100);  
  55.             } catch (InterruptedException e) {  
  56.                 // TODO Auto-generated catch block  
  57.                 e.printStackTrace();  
  58.             }  
  59.         }  
  60.         response.close();  
  61.         context.term();  
  62.     }  
  63. }  

這裏代碼用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的源碼吧。。。。

相關文章
相關標籤/搜索