【问题标题】:Pipeline Remove Semantics for ChannelInitializerChannelInitializer 的管道删除语义
【发布时间】: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 的名称被添加到管道中,然后随后被删除。


但是,如果 ChannelHandlerChannelInitializer 的一个实例,那么同样的模式不会被采用:

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


    【解决方案1】:

    在您的 ChannelInitializer 中,您可以按照 here 的说明实现方法 handlerRemoved。这将允许您的处理程序删除管道中所有添加的处理程序,但当然,您的 ChannelInitializer 应该知道添加了哪些处理程序(命名或类)以便能够删除它们。

    另一种方法是在您添加的新处理程序“之前”选择第一个处理程序,然后删除此处理程序之后的所有处理程序,可能直到另一个已知保留在管道中的处理程序。

    例如,假设您的管道如下(仅提供名称):

    • firstHandler
    • secondHandler
    • toberemoved1
    • toberemoved2
    • toKeepHandler

    伪代码:

    List<String> names = ctx.pipeline().names();
    iterates on names
      found the first one to keep (secondHandler)
      until the last one to keep (toKeepHandler or the last one)
      creating a new list of toRemovedNames (toberemoved1, toberemoved2).
    iterates on toRemovedNames
      for each call ctx.pipeline().remove(name);
    

    【讨论】:

      猜你喜欢
      • 2018-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-20
      • 2019-09-12
      • 2022-01-27
      • 1970-01-01
      • 2021-04-11
      相关资源
      最近更新 更多