Java Netty中ChannelInitializer相对于通道处理程序的优势
直接使用ChannelInitializer比使用ChannelHandler链有什么好处 例如,使用服务器引导,我可以执行以下操作: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
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负载。