文档章节

Mina IoFilter 过滤链的基本原理。

D
 DuangDong
发布于 2016/11/23 16:52
字数 818
阅读 11
收藏 0
点赞 0
评论 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
海淀
使用 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
Apache Mina Server 2.0 中文参考手册 【笔记】

Apache Mina Server 2.0 中文参考手册 3. 介绍Mina的TCP的主要接口: (1.)IoService: 这个接口是服务端IoAcceptor、客户端IoConnector 的抽象,提供IO 服务和管理IoSession的功能,它有如下...

LuXing
2014/03/31
0
1
使用 Apache MINA 2 开发网络应用

Apache MINA 2 是一个开发高性能和高可伸缩性网络应用程序的网络应用框架。它提供了一个抽象的事件驱动的异步 API,可以使用 TCP/IP、UDP/IP、串口和虚拟机内部的管道等传输方式。Apache MI...

红薯
2009/12/08
1K
0
cxxjava/CxxConet

CxxConet 基于协程的C++网络开发框架. 目录 特点 协程模型 通信流程 示例 性能 依赖 Support 特点 跨平台:同时支持Linux32/64、OSX64两个平台,支持C++11及以上; 易开发:同步的方式编写代...

cxxjava
2017/05/11
0
0
Mina源码阅读笔记(七)—Mina的拦截器FilterChain

接上一篇《异步IO实现IoFuture》 Filter我们很熟悉,在Mina中,filter chain的用法也类似于Servlet的filters,这种拦截器的设计思想能够狠轻松的帮助我们实现对资源的统一处理。我们先大致连...

Gaischen
2012/11/27
0
1
Apache MINA --- [使用JMX来管理MINA应用]

要让MINA应用可以被JMX管理,我们需要执行以下几个步骤: 1.创建MBean服务. // create a JMX MBean Server server instanceMBeanServer mBeanServer = ManagementFactory.getPlatformMBeanSer......

moonsnake777
2016/04/29
65
0
Apache MINA 2.0.0-M6 版本发布

Apache MINA 2.0.0-M6 版本发布 这个版本修正了一些重要的BUG, Mina开发组目前的目标仍是为下一个版本(RC1) DIRMINA-687 FIXED 2.0.0-M5 REGRESSION: sessionClosed called before doDecod...

JavaGG
2009/06/07
536
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Laravel5.5 MySQL配置、读写分离及操作

Laravel 让连接不同数据库以及对数据库进行增删改查操作: 参考:http://laravelacademy.org/post/854.html 配置读写分离 应用的数据库配置位于 config/database.php(但是数据库用户及密码等...

MichaelShu
3分钟前
0
0
TraitsUI与Mayavi实例

一:创建一个简单的TraitsUI与Mayavi实例 # -*- coding: utf-8 -*-from numpy import sqrt,sin,mgridfrom traits.api import HasTraits,Instancefrom traitsui.api import View,Item......

wangxuwei
8分钟前
0
0
Linux 查看用户

存储帐号的文件:/etc/passwd 存储密码的文件:/etc/shadow 查看当前系统所有用户 grep bash /etc/passwd root修改普通用户的密码 sudo passwd user_name 然后连续两次输入新的用户密码即可...

yeahlife
10分钟前
0
0
Webpack使用nodemon实时打包编译

业务场景: 1.编写一个npm组件包并且link到了项目文件中 2.需要不断的修改并run build编译npm包并且在项目run dev 查看效果 3.问题: 每次改完npm包都要手动run build编译十分的麻烦且低效,可不...

JamesView
21分钟前
0
0
电脑炸了,浪费我好几天时间,还是简要记下来吧

我的小本本一直在兢兢业业的干活,然而前几天说炸就炸了...... 爆炸现场: 软件: windows10 pro + EIS11+ 360卫士 BIOS:N1DET98W 2.24 硬件: Xeon E3 1505-V5 nv-M3000M thinkpadP70:20E...

Oh_really
25分钟前
0
0
Git之branch和checkout

1.branch是查看、创建、删除分支 #>git branch --helpNAME git-branch - List, create, or delete branchesSYNOPSIS git branch [--color[=<when>] | --no-color] [......

汉斯-冯-拉特
27分钟前
0
0
Mybatis拦截器之数据权限过滤与分页集成

需求场景 最近项目有个数据权限的业务需求,要求大致为每个单位只能查看本级单位及下属单位的数据,例如:一个集团军下属十二个旅,那么军级用户可以看到所有数据,而每个旅则只能看到本旅部...

佛系程序猿灬
36分钟前
9
0
SpringCloud 微服务 (十六) 服务追踪 Zipkin

问题 在服务中,有一个接口,该A接口中又调用了其他服务的B、C、D接口,出现一个请求耗时大的问题,这时候并不知道该B、C、D接口中哪个接口造成的耗时量,然后比如确定C服务接口出现的耗时量大,但...

___大侠
今天
0
0
Java面试基础篇——第八篇:抽象类与接口的区别

1.抽象类 抽象类:如果一个类中包含有抽象方法,或这个类使用abstract关键字修饰,则称这个类是抽象类。 抽象方法是什么呢?抽象方法就是指用abstract关键字修饰的方法。 需要注意的是:抽象...

developlee的潇洒人生
今天
2
0
jsoup 相关资料

1.jsoup 2.Jsoup概述 3.jsoup入门 4.jsoup Java HTML Parser 1.11.3 API

IT追寻者
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部