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的,通常用來解碼

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM