mina源码阅读之过滤器

mina中的过滤器用IoFilter接口表示,默认实现类为IoFilterAdapter,IoFilter中包含了一个NextFilter接口,用于指向下一个过滤器,并且接口中定义的方法名与IoFilter接口中的一致。如果要实现自定义的过滤器,只需实现IoFilter接口即可,如果只是关注其中某几个方法,可以继承IoFilterAdapter类,重写相应的方法。注意,如果想让自定义的过滤器执行完之后后面的过滤器接着执行的话,则要在重写的方法中调用NextFilter的同名方法,否则过滤器链的执行将会中断,就相当于tomcat中的过滤器必须调用filterChain.doFilter(request,response)才能继续前进一样。
过滤器链用IoFilterChain接口表示,默认实现类为DefaultIoFilterChain,IoFilterChain中包含了一个Entry接口,该接口的实现类中封装了过滤器,并且有两个自引用的属性prevEntry和nextEntry,分别用于指向前一个Entry对象和后一个Entry对象。
IoFilterChainBuilder接口用于构造过滤器链,默认实现类为DefaultIoFilterChainBuilder。其中buildFilterChain方法用于构造过滤器链。
这几个接口首先进行实例化的是IoFilterChainBuilder,
mina在创建接收器NioSocketAcceptor的时候就会初始化DefaultIoFilterChainBuilder对象的Entry集合。接着通过acceptor.getFilterChain().addLast()方法将过滤器封装成Entry对象并添加到Entry集合中,由于Entry集合是CopyOnWriteArrayList类型的,并且每次添加的Entry对象的index都在entries.size(),因此Entry集合中的顺序跟我们添加过滤器的顺序是一致的。
接着在创建Session对象的时候实例化IoFilterChain接口,创建过滤器链。此时的过滤器链只有两个过滤器,分别是HeadFilter和TailFilter。HeadFilter是过滤器的开始,而TailFilter是过滤器的结尾,当所有的过滤器都执行过之后就会在TailFilter中调用对应的IoHandler进行下一步处理。
在Processor线程中处理Session对象的时候,会调用DefaultIoFilterChainBuilder的buildFilterChain方法,将Entry集合中的数据全部保存到DefaultIoFilterChain中,构建完整的过滤器链,到这一步过滤器链算是构建完成了。
最后我们以messageReceived方法为例来看看过滤器链的执行过程,起点是DefaultIoFilterChain类的fireMessageReceived方法,方法中调用callNextMessageReceived获取当前要执行的过滤器和紧接着执行的过滤器。第一个需要执行的过滤器是HeadFilter,由于HeadFilter并没有重写父类的messageReceived方法,因此实际执行的是IoFilterAdapter的messageReceived方法。而IoFilterAdapter的messageReceived方法中直接调用NextFilter的messageReceived方法执行下一个过滤器,以此类推直到TailFilter类的messageReceived方法,最后在该方法中调用IoHandler的messageReceived方法执行具体的业务逻辑。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值