<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.調(diào)用方式:example
       
        DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();

        MdcInjectionFilter mdcInjectionFilter = new MdcInjectionFilter();
        chain.addLast("mdc", mdcInjectionFilter);
     
    2.Filter相關(guān)類圖


    3.源碼解讀_DefaultIoFilterChainBuilder

            1.DefaultIoFilterChainBuilder內(nèi)部維護(hù)一個(gè)Entry的列表
                    List<Entry> entries = new CopyOnWriteArrayList<Entry>();

            2.public synchronized void addLast(String name, IoFilter filter) 內(nèi)部調(diào)用register方法:register(entries.size(), new EntryImpl(name, filter))
                    其核心代碼為:entries.add(index, e);
              同理其內(nèi)部addFirst/addBore/addAfter,均是將filter-pair(Entry)加入到list的不同位置.
           
            3.其實(shí)現(xiàn)IoFilterChainBuilder接口內(nèi)的方法:buildFilterChain(IoFilterChain chain)
                    for (Entry e : entries) {
                            chain.addLast(e.getName(), e.getFilter());
                     }
                即調(diào)用IoFilerChain的方法組裝filter
           
            ->所以IoFilterChainBuilder是IoFilerChain的構(gòu)建接口.

    4.源碼解讀_DefaultIoFilterChain

            1.其整體內(nèi)部實(shí)現(xiàn)了一個(gè)雙向鏈表.
                    這里從head,tail以及EntryImpl的定義prevEntry/nextEntry可見一斑.

            2.public synchronized void addLast(String name, IoFilter filter)->內(nèi)部調(diào)用register方法:register(tail.prevEntry, name, filter)
                    將尾部指針的前驅(qū)節(jié)點(diǎn)(tail.prevEntry)傳入作為新節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)->
                    ->將tail.prevEntry.nextEntry這里即tail作為新節(jié)點(diǎn)的后繼節(jié)點(diǎn)

            3.private void register(EntryImpl prevEntry, String name, IoFilter filter)
                    1.新建節(jié)點(diǎn)newEntry
                    2.調(diào)用filter.onPreAdd
                    3.調(diào)整鏈表的前驅(qū)后繼關(guān)系并將newEntry加入Map<String, Entry> name2entry
                    4.調(diào)用filter.onPostAdd

    5.源碼解讀_NextFilter

            1.DefaultIoFilterChain中節(jié)點(diǎn)EntryImpl中有一個(gè)private final NextFilter nextFilter
                    ->其表示當(dāng)前節(jié)點(diǎn)filter的下一個(gè)IoFilter

            2.EntryImp初始化nextFiler是用一個(gè)匿名內(nèi)部類初始化并覆寫接口方法
                    1.messageReceived(IoSession session, Object message)
                            ->調(diào)用callNextMessageReceived(nextEntry,session,message),其中nextEntry為當(dāng)前節(jié)點(diǎn)的后繼節(jié)點(diǎn)
                            ->后繼節(jié)點(diǎn)執(zhí)行filter.messageReceived(nextFilter, session, message),其中nextFiler為后繼節(jié)點(diǎn)的NextFiler對(duì)象.

                    也就是說(shuō)每個(gè)Filter的實(shí)現(xiàn)類如果在messageReceived(NextFilter nextFilter, IoSession session, Object message)中調(diào)用了nextFiler.messageReceive方法,則表示沿著過(guò)濾鏈繼續(xù)forward>>>>>>.而IoFilterAdapter的默認(rèn)實(shí)現(xiàn)則是這樣.

                    2.filterWrite(IoSession session, WriteRequest writeRequest)
                            ->調(diào)用callPreviousFilterWrite(nextEntry, session, writeRequest),其中nextEntry為當(dāng)前節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)
                            ->前驅(qū)節(jié)點(diǎn)執(zhí)行filter.filterWrite(nextFilter, session, writeRequest),其中nextFiler為前驅(qū)節(jié)點(diǎn)的NextFiler對(duì)象.

                    同上,即每個(gè)Filer的實(shí)現(xiàn)類如果在filterWrite(NextFilter nextFilter, IoSession session, WriteRequest writeRequest)中調(diào)用了nextFilter.filterWrite方法,則表示沿著過(guò)濾鏈繼續(xù)forward<<<<<<<.

    6.源碼解讀_HeadFilter

         1.此為DefaultIoFilterChain中頭結(jié)點(diǎn)的過(guò)濾器.

         2.此過(guò)濾器繼承了IoFilterAdapter,所以其messageReceived方法默認(rèn)調(diào)用了nextFiler.messageReceived方法,即收到消息不處理,直接轉(zhuǎn)發(fā)后繼節(jié)點(diǎn)進(jìn)行過(guò)濾處理.

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

    7.源碼解讀_TailFilter

         1.此為DefaultIoFilterChain中尾節(jié)點(diǎn)的過(guò)濾器.

         2.其繼承了IoFilterAdapter并覆寫了所有方法:
          其中sessionCreated/sessionOpened/sessionIdle/exceptionCaught/messageReceived/messageSent均調(diào)用了session.getHandler()的相關(guān)方法,即IoHandler,這個(gè)我們經(jīng)常用到且經(jīng)常寫的IoHandler.
         而filterWrite/filterClose則直接調(diào)用nextFilter.相關(guān)方法,即繼續(xù)沿著過(guò)濾鏈<<<<<forward.

    8源碼解讀_ProtocolCodecFilter
         1.此為編解碼過(guò)濾器,用來(lái)編碼為二進(jìn)制數(shù)據(jù)或者將特定協(xié)議的數(shù)據(jù)解碼成消息對(duì)象.

         2.其覆寫了messageReceived:
              1.一個(gè)while循環(huán),直到buffer沒有數(shù)據(jù).while(in.hasRemaining)
              2.循環(huán)內(nèi)業(yè)務(wù)為調(diào)用decoder.decode方法進(jìn)行解碼
              3.調(diào)用decoderOut.flush完成解碼->{@link ProtocolDecoderOutputImpl #flush}->調(diào)用nextFilter.messageReceived,即繼續(xù)在過(guò)濾鏈進(jìn)行forward>>>>>>

         3.其覆寫了filterWrite
              1.調(diào)用encoder.encoder進(jìn)行編碼
              2.調(diào)用nextFilter.filterWrite,即繼續(xù)沿著過(guò)濾鏈進(jìn)行<<<<<<forward

    8.總結(jié)
        mina的內(nèi)部采用filer_chain模式進(jìn)行消息的流轉(zhuǎn)(雙向)處理

        以讀寫消息來(lái)簡(jiǎn)單的說(shuō)明一下filter_chain過(guò)程:

           1.processor...binary_msg-->>HeadFilter#messageReceived-->>....-->>XXXFilter#messageReceived...-->>TailFilter#messageReceived-->>調(diào)用IoHandler#messageReceived
     在HeadFilter和TailFilter之間自定義過(guò)濾器,如firewall,log,decoder等

          2.procotol_msg-->>TailFilter#filterWrite-->>....-->>XXXFilter#FilterWrite....-->>HeaderFilter-->>由processor處理write
     在TailFilter和HeadFiler之間可自定義過(guò)濾器,如encoder等.    

    posted on 2013-11-26 17:26 landon 閱讀(1679) 評(píng)論(0)  編輯  收藏 所屬分類: Sources
    主站蜘蛛池模板: 国产亚洲一区二区在线观看 | 亚洲成人在线网站| 亚洲综合色视频在线观看| 亚洲 自拍 另类小说综合图区| 午夜男人一级毛片免费| 成年在线网站免费观看无广告| 中文字幕无码成人免费视频| 麻豆一区二区免费播放网站| 日本在线高清免费爱做网站| 免费阿v网站在线观看g| 大地资源免费更新在线播放| 在线a人片天堂免费观看高清| 午夜影视在线免费观看| 国产男女性潮高清免费网站| 国产免费人成在线视频| 免费人成年轻人电影| 亚洲成a人片在线观看老师| 亚洲综合久久夜AV | 亚洲精品无码不卡在线播放HE| 亚洲熟妇无码AV在线播放| 亚洲伊人久久大香线蕉综合图片| 亚洲乱码无码永久不卡在线| 亚洲AV无码一区二区二三区入口| 亚洲精选在线观看| 亚洲成人黄色在线| 亚洲a∨国产av综合av下载| 成人一级免费视频| 国产啪精品视频网站免费尤物| 十八禁无码免费网站| 国产成人午夜精品免费视频| 成人a视频片在线观看免费| 国产免费一区二区三区VR| 永久亚洲成a人片777777| 亚洲成在人天堂一区二区| 国产成人精品日本亚洲18图| 国产在亚洲线视频观看| 中文在线免费视频| 亚洲黄色免费网址| 国产免费一区二区三区VR| 久久国产精品亚洲一区二区| 亚洲粉嫩美白在线|