欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

handler在pipeline當如何存儲

這篇文章主要介紹“handler在pipeline當如何存儲”,在日常操作中,相信很多人在handler在pipeline當如何存儲問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”handler在pipeline當如何存儲”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

為烏什等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務(wù),及烏什網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為網(wǎng)站制作、成都做網(wǎng)站、烏什網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!

今天解決2個問題,

1、handler在pipeline當中究竟是如何存儲的;

2、在遍歷handler的過程中,會根據(jù)event的不同,調(diào)用不同的handler,這一點是如何實現(xiàn)的。

先研究第一個問題:

TailHandler tailHandler = new TailHandler();
tail = new DefaultChannelHandlerContext(this, null, generateName(tailHandler), tailHandler);

HeadHandler headHandler = new HeadHandler(channel.unsafe());
head = new DefaultChannelHandlerContext(this, null, generateName(headHandler), headHandler);

head.next = tail;
tail.prev = head;

這是DefaultChannelPipeline構(gòu)造函數(shù)當中的一段代碼,我們之前提到過,在pipeline當中存在一個雙向鏈表,這里就是把雙向鏈表的頭和尾進行了初始化。

之后我們通過addlast方法向pipeline當中添加handler,

DefaultChannelHandlerContext prev = tail.prev;
newCtx.prev = prev;
newCtx.next = tail;
prev.next = newCtx;
tail.prev = newCtx;

這里就是把一個新的handler加入到雙向鏈表當中去。

另一個問題,雙向鏈表當中的元素究竟是什么,

DefaultChannelHandlerContext newCtx =
                    new DefaultChannelHandlerContext(this, invoker, name, handler);

需要看這個,簡單理解,把handler放到了一個新的 DefaultChannelHandlerContext 當中。那么它的作用究竟是什么呢?

通過對代碼的研究, DefaultChannelHandlerContext其實是一個動態(tài)代理類,而我們的各個handler,就是被代理的類。這里有兩點需要解釋一下。先看下面這段代碼

    @Override
    public ChannelFuture write(Object msg, ChannelPromise promise) {
        DefaultChannelHandlerContext next = findContextOutbound(MASK_WRITE);
        next.invoker.invokeWrite(next, msg, promise);
        return promise;
    }

首先,不要被write方法所迷惑,這個方法里面確實執(zhí)行的write的動作,以及write當中所包含的encode的動作。但是請注意,這個write動作,并不是當前元素的write,而是鏈表當中下一個元素當中的handler的write,在handler的write方法的末尾,會執(zhí)行next.write,這里又會執(zhí)行再下一個元素當中的handler的write。依次類推,實現(xiàn)了鏈表的遍歷。

其次:不要被invoke所迷惑,這里并沒有用到j(luò)ava的反射機制,因為 不論你傳入什么樣的handler,都來自ChannelHandler這個統(tǒng)一的老祖宗。按需要調(diào)用不同的方法即可。跟反射一毛錢關(guān)系都沒有。

然后是第二個問題:

首先明確一個概念:所有的handler來自同一個祖宗ChannelHandler ,而 ChannelHandler 當中的不同方法,對應(yīng)了netty當中各個不同的事件。

我們在初始化bootstrap的時候,加入了很多個handler,有些負責下行的decode,有些負責上行的encode,我們當然希望,下行的時候,只進入下行相關(guān)的handler,上行的時候,只進入上行相關(guān)的handler。那么具體是怎么做到的呢?看下面這段代碼,鑒于篇幅問題,只摘錄了其中一段:

if (handlerType.getMethod(
    "handlerAdded", ChannelHandlerContext.class).isAnnotationPresent(Skip.class)) {
    flags |= MASK_HANDLER_ADDED;
}

在構(gòu)造一個 DefaultChannelHandlerContext,會有這樣的一段代碼,我們可以這樣理解這段語句:根據(jù)handler當中不通方法的注解,來判定當發(fā)生某個event的時候,該方法是否執(zhí)行。

ChannelHandlerAdapter 是 ChannelHandler 一個最基礎(chǔ)的實現(xiàn),我們看一下 ChannelHandlerAdapter 的代碼,會發(fā)現(xiàn),每一個方法頭部,都會有一個@Skip的注解。也就是說,默認情況下,每一個方法都不會被執(zhí)行。而在 ChannelHandlerAdapter 的子孫當中,Override了某一個方法, @Skip 就沒有了。那么這個handler的這個方法,就會被執(zhí)行。

至于具體的判定過程,可以參照另一個篇文章android edittext.setInputType,當中按位進行設(shè)置的思想。

到此,關(guān)于“handler在pipeline當如何存儲”的學習就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

分享文章:handler在pipeline當如何存儲
本文鏈接:http://www.chinadenli.net/article10/gpcedo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈App設(shè)計服務(wù)器托管網(wǎng)站設(shè)計微信小程序網(wǎng)站導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化