<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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 閱讀(1670) 評論(0)  編輯  收藏 所屬分類: Sources
    主站蜘蛛池模板: 亚洲春色另类小说| 亚洲综合熟女久久久30p| 亚洲视频在线观看| 中文字幕乱码系列免费| 免费人成激情视频| 国产亚洲精品2021自在线| 免费a级毛片大学生免费观看 | 亚洲丝袜美腿视频| 亚洲成A人片在线播放器| 18禁网站免费无遮挡无码中文 | 亚洲最新视频在线观看| 久久精品国产大片免费观看| 国产一区二区三区在线免费 | 伊人亚洲综合青草青草久热| 黄色毛片免费观看| 成人影片麻豆国产影片免费观看| 亚洲人成人网毛片在线播放| 女人被男人桶得好爽免费视频| 国产在亚洲线视频观看| 四虎影视在线永久免费看黄| 一级a性色生活片久久无少妇一级婬片免费放 | 最近免费mv在线观看动漫 | 国产精品亚洲片在线观看不卡| 日本一区午夜艳熟免费| 久久av无码专区亚洲av桃花岛 | 成年女人喷潮毛片免费播放| 亚洲爆乳成av人在线视菜奈实| 亚洲精品一级无码中文字幕| 国产午夜无码片免费| 亚洲大香人伊一本线| 国产乱弄免费视频| 伊人免费在线观看高清版| 亚洲理论片在线中文字幕| 爽爽日本在线视频免费| 婷婷亚洲天堂影院| 久久亚洲国产欧洲精品一| 亚洲乱码中文字幕手机在线 | 亚洲国产高清国产拍精品| 国产亚洲人成无码网在线观看| 18禁成人网站免费观看| 色窝窝亚洲AV网在线观看|