1. 程式人生 > >關於Netty Pipeline中Handler的執行順序問題

關於Netty Pipeline中Handler的執行順序問題

add lin 代碼 是我 copy AC encoder for enc

原文地址:http://blog.csdn.net/wgyvip/article/details/25637651

最近在學習Netty框架,根據官網的教程學著做了幾個小測試,都成功了,後面開始試著寫自己的應用的時候出了問題:Server發出的數據到達Client之後一直解碼失敗,折騰了好久,對比著官方的實例代碼一步步走,最後終於在ChannelInitializer中發現了問題。原來我是這樣寫的:

[java] view plain copy
  1. pipeline.addLast("StringDecoder", new StringDecoder(Charset.forName("UTF-8")));
  2. pipeline.addLast("ServerHandler", new ServerHandler());
  3. pipeline.addLast("StringEncoder", new StringEncoder(Charset.forName("UTF-8")));

官網的教程是這樣寫的:

[java] view plain copy
  1. pipeline.addLast("StringDecoder", new StringDecoder(Charset.forName("UTF-8")));
  2. pipeline.addLast("StringEncoder", new StringEncoder(Charset.forName("UTF-8")));
  3. pipeline.addLast("ServerHandler", new ServerHandler());

註意到Handler在Pipeline中的順序不一樣。在Netty文檔裏看到Handler在Pipeline中的執行順序是InboundHandler順序執行,OutboundHandler逆序執行,我原以為所謂的你須執行會從Pipeline的最後一項開始執行,所以講所有的OutboundHandler都放在了最後,為了看著方便,其實不是這樣的。在InboundHandler執行完成需要調用Outbound的時候,比如ChannelHandlerContext.write()方法,Netty是直接從該InboundHandler返回逆序的查找該InboundHandler之前的OutboundHandler,並非從Pipeline的最後一項Handler開始查找,是我的理解錯了。

剛開始學習,很多地方只是一知半解,自己說得不清不楚,還得繼續學習啊。

關於Netty Pipeline中Handler的執行順序問題