我需要能够根据某些条件在管道上添加和删除IdleStateHandler。我为每个通道创建一个IdleStateHandler实例,并将对该实例的引用保存在连接类中。
但是,当我删除处理程序然后再添加回该处理程序时,出现一个异常,因为该处理程序不可共享,因此无法多次添加。
我知道无法跨多个渠道共享同一处理程序。但是,就我而言,处理程序实例对于每个通道都是唯一的。为什么这需要处理程序可共享?有什么解决方法吗?我知道我每次都可以创建一个新实例,但是我们正在尝试减少创建的新对象的数量。
答案 0 :(得分:0)
大多数处理程序都有某种生命周期,这使得支持移除和重新添加变得颇具挑战性。话虽如此,我想它可以完成...到今天为止,尚无办法使其与IdleStateHandler
一起使用,因此您需要再次创建处理程序。就是说,我想知道为什么您不仅在管道中可以有另一个处理程序来转发IdleStateEvent
或不显示它。如果您不希望发生这些事件,则类似于删除处理程序。
答案 1 :(得分:0)
正如诺曼所说,IdleStateHandler
的当前设计不可重用。您必须创建新的IdleStateHandler
并将旧的替换为新的实例。
现在,当将处理程序添加到管道时-管道将boolean added
中的特殊状态字段ChannelHandlerAdapter
标记为true
。但是,当删除处理程序时,此标志永远不会恢复。因此,当您尝试再次添加此处理程序时,您会收到异常(因为added
仍为true
)。
实际上,您可以在将处理程序从管道中删除并重用之后,通过反射将该标志更改为false
。但是我不建议您遵循这个方向。