文档章节

Mina IoFilter 过滤链的基本原理。

D
 DuangDong
发布于 2016/11/23 16:52
字数 818
阅读 15
收藏 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 定义: 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该...

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

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

红薯
2008/10/05
2.2K
1
Java Mina-2.0.16框架学习使用

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

凌浩雨
2017/08/28
0
0
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

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周一乱弹 —— 白掌柜说了卖货不卖身

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @爱漫爱 :这是一场修行分享羽肿的单曲《Moony》 手机党少年们想听歌,请使劲儿戳(这里) @clouddyy :开不开心? 开心呀, 我又不爱睡懒觉…...

小小编辑
今天
8
0
大数据教程(11.7)hadoop2.9.1平台上仓库工具hive1.2.2搭建

上一篇文章介绍了hive2.3.4的搭建,然而这个版本已经不能稳定的支持mapreduce程序。本篇博主将分享hive1.2.2工具搭建全过程。先说明:本节就直接在上一节的hadoop环境中搭建了! 一、下载apa...

em_aaron
今天
3
0
开始看《JSP&Servlet学习笔记》

1:WEB应用简介。其中1.2.1对Web容器的工作流程写得不错 2:编写Servlet。搞清楚了Java的Web目录结构,以及Web.xml的一些配置作用。特别是讲了@WebServlet标签 3:请求与响应。更细致的讲了从...

max佩恩
今天
4
0
mysql分区功能详细介绍,以及实例

一,什么是数据库分区 前段时间写过一篇关于mysql分表的的文章,下面来说一下什么是数据库分区,以mysql为例。mysql数据库中的数据是以文件的形势存在磁盘上的,默认放在/mysql/data下面(可...

吴伟祥
今天
3
0
SQL语句查询

1.1 排序 通过order by语句,可以将查询出的结果进行排序。放置在select语句的最后。 格式: SELECT * FROM 表名 ORDER BY 排序字段ASC|DESC; ASC 升序 (默认) DESC 降序 1.查询所有商品信息,...

stars永恒
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部