Mina IoFilter 过滤链的基本原理。
Mina IoFilter 过滤链的基本原理。
DuangDong 发表于12个月前
Mina IoFilter 过滤链的基本原理。
  • 发表于 12个月前
  • 阅读 8
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 学生专属云服务套餐 10元起购>>>   

在创建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,回滚,也就是把插入的再删除掉。

共有 人打赏支持
粉丝 2
博文 1
码字总数 818
×
DuangDong
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: