基本上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的源码吧。。。。