文档章节

Mina IoFilter 过滤链的基本原理。

D
 DuangDong
发布于 2016/11/23 16:52
字数 818
阅读 11
收藏 0

在创建NIoSocketAccept对象的时候创建DefaultFilterChainBuilder。具体体现在AbstractIoService中 :

输入图片说明

在DefaultIoFilterChainBuilder中有四种将filter加入到“过滤链”中的方法,如下:

输入图片说明

但是这四个并不是 我们再代码中的addLast addFirst,是内部的实现。 注意到,四个方法都调用了register方法。那么来看register的具体实现:

.输入图片说明 .

此处的entries 是一个List:

输入图片说明

注意List的类型是 Entry,而entry:体现的是String name 和 Iofilter filter的对。他们放在过滤链中,如下:

输入图片说明

但是我们注意到此时entries只是一个List,里面所包含的filter并未放入到过滤连中。 下面给出解释: 在AbstractPollingIoProcessor中:

输入图片说明

有一个addNow方法。关于他的介绍:处理一个新的session,初始化,创建他的过滤链,触发创建的事件。便可得知,放入到过滤连中是在session创建之后才进行的,也就是说在连接建立之后进行的。 这里只说两个箭头所指的代码: 首先左边箭头: 声明一个builder等于我们前面创建的builder(在创建NioSocketAccept的时候创建的)。 右边箭头: 注意到括号里面 有一个session.getFilterChain();.到底是为什么呢? 因为在session对象创建的时候:

输入图片说明

而在过滤链创建的时候(new DefaultIoFilterChain(this)):

输入图片说明

介绍里面说道:联合session创建一个过滤链,这个过滤链只包含一个 HeadFilter 和 TailFilter。 此处的 head 和 tail :

输入图片说明

前面提到过 Entry是 filter的载体。 而此处的EntryImpl是Entry接口的实现类:

输入图片说明

他的构造方法:

输入图片说明

第一个参数是他的前一个 Entry 第二个参数是他的后一个Entry,第三个参数是他的名称,第四个参数是它所携带的filter。

而前面的的head 和 tail

输入图片说明

在1处:head前面后面的entry都为null。在2处:tail的前面一个是head后面一个是空。 在3处:head的后面一个指向tail。 继续EntryImpl: this.nextFilter = new NextFilter() 这句话包含了对NextFilter接口的实现:

输入图片说明

这里以messgeReceive为例:

输入图片说明

进入callNextMessageReceived方法:

输入图片说明

进入messageReceived方法:

输入图片说明

到了接口,进入相应的实现类:

输入图片说明

这里以keepAliveFilter为例:

输入图片说明

根据收到的消息类型作不同的处理。其他filter类似。

这里还有一个细节:

输入图片说明

FilterWrite 和 filterClose是反向的。

扯得有点远了。。。。继续说刚才右边的箭头。

前面说完一部分 session.getFilterChain(); 下面继续说 buildFilterChain 方法:

输入图片说明

这个方法吧entries里面的filter放到了chain里面。(就是前面说的建立连接的时候。)

看看IoFilterChain里面的这四个方法。

输入图片说明

看看他们的具体实现:

输入图片说明

里面有个register方法:

输入图片说明

参数:preEntry ,name,filter:

第378行:

定义一个newEntry,他的preEntry 是preEntry,他的nextEntry是preEntry的nextEntry。(根据EntryImpl的构造函数的定义得知。)

要插入完成,根据链表的定义,我们只需要保证preEntry的后一个是newEntry,并且preEntry的后一个的 前一个 是newEntry 就可以了。

Try块里面执行了add之前所要执行的事件。

输入图片说明

没毛病,插入成功。

Try块里面执行了add之后所要执行的事件。

如果出现异常,执行dregister0,回滚,也就是把插入的再删除掉。

© 著作权归作者所有

共有 人打赏支持
D
粉丝 1
博文 1
码字总数 818
作品 0
海淀
责任链模式的使用-Netty ChannelPipeline和Mina IoFilterChain分析

本文来自网易云社区 作者:乔安然 1. Chain of Responsiblity 定义: 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该...

网易云
09/18
0
0
使用 Apache MINA 开发高性能网络应用程序 

本文将通过一个简单的问候程序 HelloServer 来介绍 MINA 的基础架构的同时演示如何使用 MINA 开发网络应用程序。 Apache MINA(Multipurpose Infrastructure for Network Applications) 是 Ap...

红薯
2008/10/05
2.2K
1
Mina2.0x框架+源码分析

Mina2.0x最新的源码包可以在网址:http://apache.fayea.com/mina/mina/2.0.9/apache-mina-2.0.9-src.tar.gz处下载: 整体架构: 核心过程(IoAcceptor 与 IoConnector通讯) 客户端: 1)通过...

k_k_anna
2015/01/26
0
0
Apche Mina 2.X 入门解析

这里输入引用文本本博文借鉴于梦筑小屋博文、IBM文库 Apache Mina(Multipurpose Infrastructure Networked Applications)是一个网络应用框架,用以开发高可用、高扩展的典型C/S网络应用程...

王月云
2016/09/28
23
0
Apache Mina 网络通信

Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于TCP/IP、UDP/IP协议栈的通信框架(当然,也可以提供JAVA 对象的序列化服务、虚拟机管道通信服务等),Mina 可以帮助我...

Mr&Cheng
2013/01/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

利用碎片化时间Get Linux系统

起初,我做着一份与IT毫无关系的工作,每月领着可怜的工资,一直想改变现状,但无从下手,也就是大家熟知的迷茫。我相信,每一个人都会或多或少的经历过迷茫,迷茫每一个选择,迷茫工作或者生...

Linux就该这么学
20分钟前
0
0
图像显示深入学习一:Activity启动过程

一个月左右写了图像显示深入学习之文章开篇文章表明了自己近期的计划,前半年重新学习了opengl es,c++以及Linux的一些知识,觉得是时候开始看图像这一块的源码了,边看边补缺补漏吧。 作为该...

JerryLin123
42分钟前
1
0
给MySQL授权远程访问

putty登录服务器; 登录MySQL: mysql -u root -p 新建远程用户: CREATE USER 'myusername' IDENTIFIED BY 'mypassword'; 授权: grant all on *.* to john@'101.102.103.104' identified by......

sweethome
今天
1
0
在t-io老巢造谣,不过有造谣的就会有反造谣的!

只发当事人的截图,不发表评论,以免有引导嫌疑 PS: 截图是由不同的人发过来的 本人已经不在此微信群 图3:有造谣的,就有反造谣的 图4是2018-09-23的t-io官方群的一个发言小统计,有助于让...

talent-tan
今天
100
0
heartbeat 资源

drbd+apache+heartbeat : http://blog.51cto.com/11838039/1827901 heartbeat双机热备的架设 : http://blog.51cto.com/11838039/1827560 对heaetbeat的深一步认识 : http://blog.51cto.co......

寰宇01
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部