ZeroMQ(java)中监控Socket
基本上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();
- 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();
- 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();
- } 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的源码吧。。。。
ZeroMQ(java)中监控Socket的更多相关文章
- ZeroMQ(java)中的数据流SessionBase与SocketBase
前面的文章中已经比较的清楚了ZeroMQ(java)中如何在底层处理IO, 通过StreamEngine对象来维护SelectableChannel对象以及IO的事件回调,然后通过Poller对象来维 ...
- ZeroMQ(JAVA)中的数据流,SessionBase与SocketBase
前面的文章中已经比较的清楚了ZeroMQ(java)中如何在底层处理IO, 通过StreamEngine对象来维护SelectableChannel对象以及IO的事件回调,然后通过Poller对象来维 ...
- Java中的Socket的用法
Java中的Socket的用法 Java中的Socket分为普通的Socket和NioSocket. 普通Socket的用法 Java中的 ...
- 读懂Java中的Socket编程
Socket,又称为套接字,Socket是计算机网络通信的基本的技术之一.如今大多数基于网络的软件,如浏览器,即时通讯工具甚至是P2P下载都是基于Socket实现的.本文会介绍一下基于TCP/IP的S ...
- 读懂Java中的Socket编程(转)
Socket,又称为套接字,Socket是计算机网络通信的基本的技术之一.如今大多数基于网络的软件,如浏览器,即时通讯工具甚至是P2P下载都是基于Socket实现的.本文会介绍一下基于TCP/IP的S ...
- java中的socket编程
Socket,又称为套接字,Socket是计算机网络通信的基本的技术之一.如今大多数基于网络的软件,如浏览器,即时通讯工具甚至是P2P下载都是基于Socket实现的.本文会介绍一下基于TCP/IP的S ...
- Java中的Socket用法
转发链接:https://www.cnblogs.com/zhanglei93/p/6217384.html (1)Java中的Socket用法 Java中的Socket分为普通的Socket和Nio ...
- ZeroMQ(java)中组件间数据传输(Pipe的实现)
在ZeroMQ(java)中,整个IO的处理流程都是分层来进行的,当然处于最下端的肯定是前面介绍过的poller以及StreamEngin了....涉及到上层的话就还有session,以及socket ...
- Java中使用Socket连接判断Inputstream结束,java tcp socket服务端,python tcp socket客户端
最近在试着用java写一个socket的服务器,用python写一个socket的客户端来完成二者之间的通信,但是发现存在一个问题,服务器方面就卡在读取inputsream的地方不动了,导致后面的代码 ...
随机推荐
- css清楚浮动的几种常用方法
请先看博客:http://www.jb51.net/css/173023.html
- js判断页面出现滚动条
当可视区域小于页面的实际高度时,判定为出现滚动条 当我们在获取页面的offsetHeight高度时是包括了浏览器的边框的,浏览器的边框是2个像素, if (document.documentEleme ...
- JS截取字符串常用方法
reference:http://www.jb51.net/article/42482.htm 使用 substring()或者slice() 函数:split() 功能:使用一个指定的分隔符把一个字 ...
- 第十一课:js操作选择器的通用函数
1.判断文档是否是XML文档 var isXML = function(elem){ var documentElement = elem && (elem.ownerDocument ...
- 【web必知必会】—— DOM:四个常用的方法
终于开始复习DOM的知识了,这一阵忙乎论文,基本都没好好看技术的书. 记得去年实习的时候,才开始真正的接触前端,发现原来JS可以使用的如此灵活. 说起DOM就不得不提起javascript的组成了,j ...
- ie6下使用js替换img标签src属性图片不显示的错误
首先,我必须再次强调一下,F-U-C-K I-E! 其次,简单阐述一下这个bug的出现的情况.页面中有个<a href=”javascript:void(0)” onclick=”swapImg ...
- 【BZOJ 3524】【Poi2014】Couriers 可持久化线段树
为什么这个主席树叫可持久化线段树,我不知道,具体得问达神.我无限T,然后DaD3zZ一针见血地指出了我的N*50爆内存导致无限编译超时O)ZO)ZO)Z真是太神啦.以图为鉴: 达神题解传送门:http ...
- Spring-事物的隔离级别
Spring中定义了5中不同的事务隔离级别: 1. ISOLATION_DEFAULT(一般情况下使用这种配置既可) ; 这是一个PlatfromTransactionManager默认的隔离级别,使 ...
- 《疯狂Java:突破程序员基本功的16课》读书笔记-第二章 对象与内存控制
Java内存管理分为两个方面:内存分配和内存回收.这里的内存分配特指创建Java对象时JVM为该对象在堆内存中所分配的内存空间.内存回收指的是当该Java对象失去引用,变成垃圾时,JVM的垃圾回收机制 ...
- 【ZOJ 3844】Easy Task
题意 每次把序列中最大的数a的一个和最小的数b的一个变成a-b.求最后是否能使序列里的数全部相同,能则输出这个相同的数. 分析 一定是有解的,不断减少最大数的个数,最大数减少为0个时,就是减少了不同数 ...
