2013-05-10 87 views
3

我正在試驗Netty 4中的自定義出站消息處理程序,似乎無法使其工作。處理程序只是記錄一條語句,並添加到通道管道的底部。我的理解是,這些處理程序是從下到上調用的,以便在寫入操作發佈後。自定義處理程序的想法是它會在任何其他出站消息處理程序之前執行。Netty 4出站消息處理程序關閉連接

不幸的是,當我將這個日誌處理程序添加到管道中時,我看到日誌語句,但Netty似乎立即關閉了連接。這是我的通道初始化器和出站處理器代碼。

HttpOutboundHandler.java

​​

HttpChannelInitializer.java

@Override 
protected void initChannel(SocketChannel socketChannel) throws Exception { 
    pipeline.addLast("encoder", new HttpResponseEncoder()); 
    pipeline.addLast("decoder", new HttpRequestDecoder()); 
    pipeline.addLast("aggregator", new HttpObjectAggregator(1048576); 
    pipeline.addLast("compressor", new HttpContentCompressor(gzipLevel)); 
    pipeline.addLast("outboundHandler", outboundHandler); 
    pipeline.addLast(eventExecutorGroup, "inboundHandler", inboundHandler); 
} 

最後,這裏的記錄儀輸出。

[DEBUG] (Slf4JLogger:71) - [id: 0xbddf00cf, /0:0:0:0:0:0:0:1:57402 => /0:0:0:0:0:0:0:1:8080] ACTIVE 
[DEBUG] (HttpOutboundHandler:19) - Executing outbound handler. 
[DEBUG] (Slf4JLogger:71) - [id: 0x942993c1, /0:0:0:0:0:0:0:1:57403 :> /0:0:0:0:0:0:0:1:8080] INACTIVE 

回答

2

回答我自己的問題,以防其他人發現這種情況。

事實證明,我需要將消息添加到下一個出站消息緩衝區(我相信它具有將其傳遞到鏈中下一個處理程序的效果)。我還需要保留這些信息。更新的代碼現在看起來像...

public class HttpOutboundHandler extends ChannelOutboundMessageHandlerAdapter<DefaultFullHttpResponse> { 
    private static final Logger logger = LoggerFactory.getLogger(HttpOutboundHandler.class); 

    @Override 
    public void flush(ChannelHandlerContext context, DefaultFullHttpResponse response) 
      throws Exception { 
     logger.debug("Executing outbound handler."); 
     ChannelHandlerUtil.addToNextOutboundBuffer(context, response.retain()); 
    } 
}