apache mima 过滤器——IoFilterChain。
主要处理IoSession的事件,
IoSession和IoFilterChain是一对一的关系,一个IoSession生命周期中所有的事件都被IoFilterChian捕获。
IoFilterChain是IoFilter的容器,当某一事件触发,IoFilterChain中的IoFilter会按预定的顺序处理事件,最后可以把IoSession交给IoHander处理。
包:org.apache.mina.core.filterchain
类和接口:
DefaultIoFilterChain | 过滤器链的一个默认实现 |
DefaultIoFilterChainBuilder | 用来建造过滤器链,这是一个默认实现 |
IoFilter | 过滤器,用来处理IoSession事件 |
IoFilterAdapter | 过滤器适配器,程序员可继承这个类来定义过滤器,比直接实现IoFilter接口要好 |
IoFilterChain | 过滤器链接口 |
IoFilterChainBuilder | 链建造者接口 |
IoFilterEvent | 过滤事件,封装了Io事件。程序员不会用到这个类,这个类是给mina内部组件用的 |
IoFilterLifeCycleException | 生命周期异常 |
总体设计:结构清晰、简单
IoFilterChainBuilder 用一个List<Entity>集合作为链的存储,在这个存储的基础上建造过滤器链IoFilterChain。
IoFilterChain在逻辑上的结构类似于双向链表(head---entity2----...tail),有头有尾有顺序,用entity表示链的节点,每个节点的数据域存放的就是过滤器。
IoFilter接口让程序员能够定义自己的过滤器,以表达对IO的处理逻辑。IoFilterAdapter简化了程序员的工作量。
IoFilter的设计:方便程序员
Io事件爆发,过滤器链发出事件,第一个过滤器就开始自动执行。而接下来第二个过滤器如何执行呢?
IoFilterChain中的过滤器如何运行,apache mina并没有提供一个控制框架,而是把这个工作交给了程序员自己,具体是通过NextFilter来实现。
IoFilter中定义了一个接口NextFilter,并在IoFilterChain.EntryImpl中对NextFilter进行了实现,NextFilter主要的工作就是查找后一个节点,并让过滤链继续调用后面的过滤器执行事件处理逻辑。这样,实际上就把链表中过滤器如何执行的权利交给了程序员。
程序员在自定义过滤器的处理逻辑中,可调用NextFilter继续到下一个过滤器,也可以让程序直接返回,如遇到异常或错误或其他情况。只要是逻辑需要,程序员可以灵活的或多或少的创建过滤器个数,以及处理执行的步骤。