【问题标题】:Advantage of ChannelInitializer over Channel Handler in NettyNetty 中 ChannelInitializer 相对于 Channel Handler 的优势
【发布时间】:2015-03-27 04:24:06
【问题描述】:

直接使用 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
    }
}

那么通道处理程序不需要了解它在哪里触发通道读取的唯一优势是什么?我没有看到使用通道初始化器的任何其他优势

【问题讨论】:

    标签: java netty nio channel


    【解决方案1】:

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

    此处指定的处理程序将始终由新的 接受频道。 ChannelInitializer 是一个特殊的处理程序,它是 旨在帮助用户配置新频道。这是最有可能的 您想通过以下方式配置新 Channel 的 ChannelPipeline 添加一些处理程序,例如 DiscardServerHandler 来实现您的 网络应用。随着应用程序变得复杂,很可能 您将向管道添加更多处理程序并提取它 匿名类最终变成了顶级类。

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

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

    【讨论】:

    • 抱歉,迟到的评论,但这不会对 GC 造成负担,为每个 HTTP 请求重新创建整个管道吗?
    • @Geronimo 无论您做什么,都会创建一个新管道。事实上,一个管道一次只被一个请求(管道)使用。您可以在管道中添加/删除一些处理程序,但管道每次都不同。我知道的唯一例外(但需要检查)是它是可共享的(无上下文),这种情况很少见,特别是在 HTTP 上下文中(例如会话不可共享)。希望它更清楚......
    • @FredericBrégier 谢谢,我最后向毛雷尔先生询问了separate question 和一个很好的response。我正在尝试一个可共享的 HTTP 编解码器/聚合器,看看我是否可以减少 GC 负载。
    猜你喜欢
    • 2013-09-30
    • 2017-03-19
    • 2010-12-23
    • 2015-07-23
    • 2011-02-26
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多