直接在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
}
}
因此,通道处理程序无需了解触发通道读取的位置的唯一优势是什么?我没有看到使用频道初始化器的任何其他优势
答案 0 :(得分:4)
根据文件(见http://netty.io/wiki/user-guide-for-4.x.html)
此处指定的处理程序将始终由新计算 接受频道。 ChannelInitializer是一个特殊的处理程序 旨在帮助用户配置新频道。这很有可能 您想要配置新频道的ChannelPipeline 添加一些处理程序,如DiscardServerHandler来实现您的 网络应用。随着应用程序变得复杂,很可能 您将向管道添加更多处理程序并将其解压缩 最终将匿名课程变成顶级课程。
所以ChannelInitializer是一种干净的方式来根据需要添加处理程序,特别是如果你有多个。
它不会阻止一个处理程序添加更多处理程序(正如您在第一个示例中所做的那样),例如根据上下文动态添加/删除管道中的一个处理程序,但是对于“静态”或“默认”一系列处理程序,使用ChannelInitializer是一种更干净的方式,因为它非常接近引导程序定义,因此更具可读性。