【发布时间】:2015-07-24 10:43:21
【问题描述】:
在构建 netty 管道时,使用 ChannelInitializer 时似乎不遵守添加/删除的语义。
举个例子,这个应该如何工作的例子:
System.out.println(ctx.pipeline().names.size()); // Size = 1
ctx.pipeline().addLast("NewHandler", mySimpleHandler);
System.out.println(ctx.pipeline().names.size()); // Size = 2
ctx.pipeline.remove("NewHandler");
System.out.println(ctx.pipeline().names.size()); // Size = 1
简单。一个名为 ChannelHandler 的名称被添加到管道中,然后随后被删除。
但是,如果 ChannelHandler 是 ChannelInitializer 的一个实例,那么同样的模式不会被采用:
System.out.println(ctx.pipeline().names.size()); // Size = 1
// NOTE: myComplexChannelInitializer will add 9 new handlers when registered
ctx.pipeline().addLast("NewHandler", myComplexChanelInitializer);
ctx.pipeline.fireChannelRegistered();
System.out.println(ctx.pipeline().names.size()); // Size = 10
ctx.pipeline.remove("NewHandler");
System.out.println(ctx.pipeline().names.size()); // Size = 10
我了解为什么会发生这种行为;在调用initChannel 之后,ChannelInitializer 会从管道中移除本身(因此它被命名为条目)。
我的问题是;我可以采取什么方法来删除 ChannelInitializer 添加的所有处理程序?
这真的感觉它需要一个嵌套管道模式,所以我可以删除嵌套管道......但是 Netty 不支持嵌套管道。
注意在我的用例中,ChannelInitializer 被传递到我的 API 中,因此我无法控制/了解包含哪些处理程序,或者它们是否有名称。
【问题讨论】:
标签: netty