一般的Netty模式是在ChannelInitializer
内设置处理程序管道,或在任何其他ChannelHandler
回调内修改管道。当基于先前的处理程序活动组装具有多个条件的复杂管道时,使用该回调样式会变得很烦人。在这种方法中也不可能公开用户友好的API。
我想创建允许编写以下代码的API
Connection conn = myServer.connectNow()
Protocol proto = new ProtocolSelector(conn).selectNow()
if (proto == PROTOCOL_1) {
new ProtocolHandler1(conn).start()
} else if (proto == PROTOCOL_2) {
new ProtocolHandler2(conn).start()
} ...
但是Netty要求在初始连接时定义完整的管道。否则,您最终将失去在建立的连接和添加的处理程序之间发生的流水线事件,因为到达流水线末端的每个事件都只是被静默删除。
我现在正在尝试创建特殊的SuspendHandler
,它始终位于管道的末尾,并且仅排队所有事件,直到添加了另一个处理程序为止。然后,它将另一个SuspendHandler
添加到管道的末尾,通过ctx.fire*
重播所有事件,并将其自身从管道中删除。
但是,这种方法对我来说似乎很棘手,而且容易出错。
还尝试了reactor-netty
,该API似乎非常适合我的要求,但我一直坚持一种简单的方案,该方案无法按预期工作(https://github.com/reactor/reactor-netty/issues/783)
因此,只需寻找任何现有的解决方案和建议即可。 谢谢!