I want to fly higher
programming Explorer
posts - 114,comments - 263,trackbacks - 0
1.调用方式:example
   
    DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();

    MdcInjectionFilter mdcInjectionFilter = new MdcInjectionFilter();
    chain.addLast("mdc", mdcInjectionFilter);
 
2.Filter相关类图


3.源码解读_DefaultIoFilterChainBuilder

        1.DefaultIoFilterChainBuilder内部维护一个Entry的列表
                List<Entry> entries = new CopyOnWriteArrayList<Entry>();

        2.public synchronized void addLast(String name, IoFilter filter) 内部调用register方法:register(entries.size(), new EntryImpl(name, filter))
                其核心代码为:entries.add(index, e);
          同理其内部addFirst/addBore/addAfter,均是将filter-pair(Entry)加入到list的不同位置.
       
        3.其实现IoFilterChainBuilder接口内的方法:buildFilterChain(IoFilterChain chain)
                for (Entry e : entries) {
                        chain.addLast(e.getName(), e.getFilter());
                 }
            即调用IoFilerChain的方法组装filter
       
        ->所以IoFilterChainBuilder是IoFilerChain的构建接口.

4.源码解读_DefaultIoFilterChain

        1.其整体内部实现了一个双向链表.
                这里从head,tail以及EntryImpl的定义prevEntry/nextEntry可见一斑.

        2.public synchronized void addLast(String name, IoFilter filter)->内部调用register方法:register(tail.prevEntry, name, filter)
                将尾部指针的前驱节点(tail.prevEntry)传入作为新节点的前驱节点->
                ->将tail.prevEntry.nextEntry这里即tail作为新节点的后继节点

        3.private void register(EntryImpl prevEntry, String name, IoFilter filter)
                1.新建节点newEntry
                2.调用filter.onPreAdd
                3.调整链表的前驱后继关系并将newEntry加入Map<String, Entry> name2entry
                4.调用filter.onPostAdd

5.源码解读_NextFilter

        1.DefaultIoFilterChain中节点EntryImpl中有一个private final NextFilter nextFilter
                ->其表示当前节点filter的下一个IoFilter

        2.EntryImp初始化nextFiler是用一个匿名内部类初始化并覆写接口方法
                1.messageReceived(IoSession session, Object message)
                        ->调用callNextMessageReceived(nextEntry,session,message),其中nextEntry为当前节点的后继节点
                        ->后继节点执行filter.messageReceived(nextFilter, session, message),其中nextFiler为后继节点的NextFiler对象.

                也就是说每个Filter的实现类如果在messageReceived(NextFilter nextFilter, IoSession session, Object message)中调用了nextFiler.messageReceive方法,则表示沿着过滤链继续forward>>>>>>.而IoFilterAdapter的默认实现则是这样.

                2.filterWrite(IoSession session, WriteRequest writeRequest)
                        ->调用callPreviousFilterWrite(nextEntry, session, writeRequest),其中nextEntry为当前节点的前驱节点
                        ->前驱节点执行filter.filterWrite(nextFilter, session, writeRequest),其中nextFiler为前驱节点的NextFiler对象.

                同上,即每个Filer的实现类如果在filterWrite(NextFilter nextFilter, IoSession session, WriteRequest writeRequest)中调用了nextFilter.filterWrite方法,则表示沿着过滤链继续forward<<<<<<<.

6.源码解读_HeadFilter

     1.此为DefaultIoFilterChain中头结点的过滤器.

     2.此过滤器继承了IoFilterAdapter,所以其messageReceived方法默认调用了nextFiler.messageReceived方法,即收到消息不处理,直接转发后继节点进行过滤处理.

     3.其主要覆写了filterWrite(NextFilter nextFilter, IoSession session, WriteRequest writeRequest) 方法
      ->由processor处理write.

7.源码解读_TailFilter

     1.此为DefaultIoFilterChain中尾节点的过滤器.

     2.其继承了IoFilterAdapter并覆写了所有方法:
      其中sessionCreated/sessionOpened/sessionIdle/exceptionCaught/messageReceived/messageSent均调用了session.getHandler()的相关方法,即IoHandler,这个我们经常用到且经常写的IoHandler.
     而filterWrite/filterClose则直接调用nextFilter.相关方法,即继续沿着过滤链<<<<<forward.

8源码解读_ProtocolCodecFilter
     1.此为编解码过滤器,用来编码为二进制数据或者将特定协议的数据解码成消息对象.

     2.其覆写了messageReceived:
          1.一个while循环,直到buffer没有数据.while(in.hasRemaining)
          2.循环内业务为调用decoder.decode方法进行解码
          3.调用decoderOut.flush完成解码->{@link ProtocolDecoderOutputImpl #flush}->调用nextFilter.messageReceived,即继续在过滤链进行forward>>>>>>

     3.其覆写了filterWrite
          1.调用encoder.encoder进行编码
          2.调用nextFilter.filterWrite,即继续沿着过滤链进行<<<<<<forward

8.总结
    mina的内部采用filer_chain模式进行消息的流转(双向)处理

    以读写消息来简单的说明一下filter_chain过程:

       1.processor...binary_msg-->>HeadFilter#messageReceived-->>....-->>XXXFilter#messageReceived...-->>TailFilter#messageReceived-->>调用IoHandler#messageReceived
 在HeadFilter和TailFilter之间自定义过滤器,如firewall,log,decoder等

      2.procotol_msg-->>TailFilter#filterWrite-->>....-->>XXXFilter#FilterWrite....-->>HeaderFilter-->>由processor处理write
 在TailFilter和HeadFiler之间可自定义过滤器,如encoder等.    

posted on 2013-11-26 17:26 landon 阅读(1665) 评论(0)  编辑  收藏 所属分类: Sources

只有注册用户登录后才能发表评论。


网站导航: