Netty中ChannelInitializer优于Channel Handler的优势

时间:2015-01-28 10:03:32

标签: java netty nio channel

直接在ChannelHandler链上使用ChannelInitializer有什么好处?

例如,我可以使用服务器引导程序:

bootstrap.childHandler(channel_handler);

添加channel_handler的实现,我将实现以下

class simple_channel_handler implements ChannelHandler
{
    public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
        // TODO Auto-generated method stub
        System.out.println("handler added");
        ctx.pipeline().addLast(new simple_channel_handler_2());
    }
}

ChannelInitializer的情况

        ch.pipeline().addLast(
                               new channel_handler_1(), 
                               new channel_handler_2()
                             );

在我可以做的每一个处理程序中

class channel_handler_1 extends ChannelInboundHandlerAdapter
{

    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        // TODO Auto-generated method stub
        System.out.println("Channel just became active");
        ctx.fireChannelRead(ctx); // Fire directly to channel handler 2
    }
}

因此,通道处理程序无需了解触发通道读取的位置的唯一优势是什么?我没有看到使用频道初始化器的任何其他优势

1 个答案:

答案 0 :(得分:4)

根据文件(见http://netty.io/wiki/user-guide-for-4.x.html

  

此处指定的处理程序将始终由新计算   接受频道。 ChannelInitializer是一个特殊的处理程序   旨在帮助用户配置新频道。这很有可能   您想要配置新频道的ChannelPipeline   添加一些处理程序,如DiscardServerHandler来实现您的   网络应用。随着应用程序变得复杂,很可能   您将向管道添加更多处理程序并将其解压缩   最终将匿名课程变成顶级课程。

所以ChannelInitializer是一种干净的方式来根据需要添加处理程序,特别是如果你有多个。

它不会阻止一个处理程序添加更多处理程序(正如您在第一个示例中所做的那样),例如根据上下文动态添加/删除管道中的一个处理程序,但是对于“静态”或“默认”一系列处理程序,使用ChannelInitializer是一种更干净的方式,因为它非常接近引导程序定义,因此更具可读性。