Netty中ChannelInitializer优于Channel Handler的优势

Des*_*Ice 5 java nio channel netty

直接使用ChannelInitializer而不是使用ChannelHandlers链有什么优势?

例如,使用服务器引导程序,我可以执行以下操作:

bootstrap.childHandler(channel_handler);
Run Code Online (Sandbox Code Playgroud)

添加在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());
    }
}
Run Code Online (Sandbox Code Playgroud)

就像ChannelInitializer一样

        ch.pipeline().addLast(
                               new channel_handler_1(), 
                               new channel_handler_2()
                             );
Run Code Online (Sandbox Code Playgroud)

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

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
    }
}
Run Code Online (Sandbox Code Playgroud)

那么,通道处理程序不需要知道将通道读取到何处的唯一好处吗?我看不到使用通道初始化程序的任何其他优势

Fre*_*ier 5

按照文档(请参阅此处http://netty.io/wiki/user-guide-for-4.x.html

此处指定的处理程序将始终由新接受的Channel评估。ChannelInitializer是一个特殊的处理程序,旨在帮助用户配置新的Channel。您很可能希望通过添加一些处理程序(例如DiscardServerHandler)来实现新的Channel的ChannelPipeline,以实现您的网络应用程序。随着应用程序变得复杂,您可能会向管道添加更多处理程序,并最终将此匿名类提取到顶级类中。

因此,ChannelInitializer是一种根据需要添加处理程序的干净方法,尤其是如果您有多个处理程序时。

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