IdleStateHandler - 在同一管道上添加和删除同一实例

IdleStateHandler - adding and removing the same instance on same pipeline

我需要能够根据特定条件在管道上添加和删除 IdleStateHandler。我为每个通道创建一个 IdleStateHandler 实例,并在连接 class.

中保存对该实例的引用

但是,当我删除处理程序然后再将其添加回来时,出现异常,无法多次添加处理程序,因为它不可共享。

我了解无法跨多个渠道共享同一个处理程序。但是,在我的例子中,处理程序实例对于每个通道都是唯一的。为什么这要求处理程序是可共享的?有什么解决方法吗?我知道我每次都可以创建一个新实例,但我们正在努力减少我们创建的新对象的数量。

大多数处理程序都有某种 life-cycle,这使得再次支持删除和 re-add 具有挑战性。那就是说我想它可以完成......截至今天,没有办法让它与 IdleStateHandler 一起工作,所以你需要再次创建处理程序。那就是说我想知道为什么你不能在管道中有另一个处理程序来转发 IdleStateEvent 或只是抑制它。如果您不想拥有这些事件,这与删除处理程序有点相同。

正如 Norman 所说,当前的设计不应该 IdleStateHandler 可重用。您必须创建新的 IdleStateHandler 并将旧实例替换为新实例。

现在,当处理程序添加到管道时 - 管道将 ChannelHandlerAdapter 中的特殊状态字段 boolean added 标记为 true。但是,当删除处理程序时,此标志永远不会恢复。因此,当您再次尝试添加此处理程序时,您会得到异常(因为 added 仍然是 true)。

实际上,在从管道中删除处理程序并重新使用它后,您可以通过反射将此标志更改为 false。但是我不建议你按照这个方向走。