Mina IoFilter 过滤链的基本原理。
在创建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,回滚,也就是把插入的再删除掉。
转载于:https://my.oschina.net/u/3066118/blog/793013