1. 程式人生 > >netty4.1.32 pipeline的新增順序和執行順序

netty4.1.32 pipeline的新增順序和執行順序

本文只想討論一下pipeline的執行順序問題,因為這個搞不明白就不知道先新增編碼還是解碼,是不是可以混淆新增等等一系列事情

 

1         pipeline.addLast(new outboundsHandler1()); //out1
2         pipeline.addLast(new outboundsHandler2()); //out2
3         
4         pipeline.addLast(new InboundsHandler1()); //in1
5         pipeline.addLast(new InboundsHandler2()); //
in2 6 pipeline.addLast("handler", new HelloServerHandler());//in3

先說最基本的, 讀入資料,需要解碼資料,執行順序和註冊順序一致 in1 --> in2 -->in3 他們之間通過 ctx.fireChannelRead(msg);進行傳遞

解碼完成,邏輯處理,進行資料傳送 通過 ctx.writeAndFlush()就完成從in -->out的轉換

out的執行順是和註冊順序相反的,也就是out2 -->out1這麼個順序 out間的傳遞通過ctx.writeAndFlush();函式進行傳遞 

ctx.channel().writeAndFlush()  和 ctx.writeAndFlush() 區別

網上說註冊 outhandler的時候,必須放到最後一個inhandler前面(本例就是in3前面),其實是不準確的 比如

1         pipeline.addLast(new InboundsHandler1()); //in1
2         pipeline.addLast(new InboundsHandler2()); //in2
3         pipeline.addLast("handler", new HelloServerHandler());//
in3 4 5 pipeline.addLast(new outboundsHandler1()); //out1 6 pipeline.addLast(new outboundsHandler2()); //out2

比如我註冊時out放後面,接收執行到in3時,執行ctx.writeAndFlush(),會發生什麼呢,outhandler不呼叫,因為ctx.writeAndFlush()是從當前節點往前查詢out類handler,而out節點註冊在當前節點後邊

這種情況要想讓他執行outhandler的處理,應該執行ctx.channel().writeAndFlush();這是從連結串列結尾開始往前查詢out類handler,這就是兩種writeAndFlush的區別

網上這種說法是使用ctx.writeAndFlush()的一種使用方式而已,還是要根據情況深入理解!

 

out就是繼承自ChannelOutboundHandlerAdapter的 通常可以用來編碼

in就是繼承自ChannelInboundHandlerAdapter的,通常用來解碼