Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Netty中ChannelInitializer相对于通道处理程序的优势_Java_Netty_Nio_Channel - Fatal编程技术网

Java Netty中ChannelInitializer相对于通道处理程序的优势

Java Netty中ChannelInitializer相对于通道处理程序的优势,java,netty,nio,channel,Java,Netty,Nio,Channel,直接使用ChannelInitializer比使用ChannelHandler链有什么好处 例如,使用服务器引导,我可以执行以下操作: bootstrap.childHandler(channel_handler); 在channel_handler的实现中,我将实现以下内容 class simple_channel_handler implements ChannelHandler { public void handlerAdded(ChannelHandlerContext ct

直接使用ChannelInitializer比使用ChannelHandler链有什么好处

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

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
    }
}
那么,通道处理程序的唯一优点是不需要了解它在哪里触发通道读取吗?根据文档,我看不到使用通道初始值设定项的任何其他优点(参见此处)

        ch.pipeline().addLast(
                               new channel_handler_1(), 
                               new channel_handler_2()
                             );
此处指定的处理程序将始终由新的 接受频道。ChannelInitializer是一个特殊的处理程序 旨在帮助用户配置新频道。很可能 您希望通过以下方式配置新通道的ChannelPipeline: 添加一些处理程序(如DiscardServerHandler)以实现 网络应用。随着应用程序变得复杂,很可能 您将向管道添加更多处理程序并提取 匿名类最终变成顶级类

因此,ChannelInitializer是一种根据需要添加处理程序的干净方法,特别是当您有多个处理程序时


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

很抱歉,最近发表了评论,但这不会对GC为每个HTTP请求重新创建整个管道造成负担吗?@Geronimo无论您做什么,都会创建一个新的管道。实际上,一个管道一次只能由一个请求(管道)使用。您可以将一些处理程序添加/删除到管道中,但管道每次都不同。我知道的唯一例外(不过需要检查)是当它是可共享的(没有上下文),这几乎不常见,特别是在HTTP上下文中(例如,会话是不可共享的)。希望它更清楚…@FredericBrégier谢谢你,我最后问了一个关于它的问题,并从Maurer先生那里得到了一个好消息。我正在尝试一个可共享的HTTP编解码器/聚合器,看看是否可以减少GC负载。