Netty 如何在处理程序外部动态添加/删除处理程序

Netty 如何在处理程序外部动态添加/删除处理程序,netty,nio,Netty,Nio,我有这样一个用例: 有一些预定义的管道,例如pipeline1=handlerA-handlerB-handlerC,pipeline2=handlerA-handlerC等等 用户可以选择其中一个管道,然后向netty服务器发送消息,该消息应由所选管道处理 我知道netty支持在管道中动态添加/删除处理程序,但是我可以找到几乎所有的示例都说明了如何在处理程序中实现该函数。在我的例子中,管道是由处理程序外部的用户更改的,但消息在处理程序内部 一个非常简单的解决方案是关闭当前运行的netty服务器

我有这样一个用例:

  • 有一些预定义的管道,例如
    pipeline1=handlerA-handlerB-handlerC
    pipeline2=handlerA-handlerC
    等等
  • 用户可以选择其中一个管道,然后向netty服务器发送消息,该消息应由所选管道处理
  • 我知道netty支持在管道中动态添加/删除处理程序,但是我可以找到几乎所有的示例都说明了如何在处理程序中实现该函数。在我的例子中,管道是由处理程序外部的用户更改的,但消息在处理程序内部

    一个非常简单的解决方案是关闭当前运行的netty服务器,然后在调用
    childHandler
    方法时使用其他管道启动一个新的netty服务器


    请问有没有更好的解决办法?关闭和启动是非常昂贵的操作。

    通道管道可以从任何线程共享和修改。如果在连接之前需要能够访问管道,则只需调用
    bootstrap.register()
    ,它将仅将通道注册到evenloop(无连接)。然后,您可以获取引用,并且只需调用
    connect()

    ,在一个顶级处理程序中可能有一个特殊的触发器来管理它?当用户想要更改时,它将发送一个用户事件触发器,并且
    usereventtrigged
    将通知此处理程序(扩展ChannelInboundHandler或其一个后代),然后允许您访问ctx。Javadoc方法
    void userEventTriggered(ChannelHandlerContext ctx,Object evt)在触发用户事件时抛出异常。非常感谢您的回复。请您解释一下如何更深入地将用户事件触发器发送到管道之外?正如我所知,对于调用
    fireUserEventTriggered
    方法,我仍然需要
    ChannelPipeline
    ChannelHandlerContext
    实例。然而,如果我能从外部获得任何一个,我就可以在其中添加或删除处理程序…该死!是的,你说得对!我能想到的是,首先添加一个特定的解码器(除非TLS先添加一个解码器,然后添加第二个解码器),该解码器将自己接受两种消息:1)标准消息将通过管道中的下一个处理程序;2)用户消息的特殊通知将更改管道,而不会继续管道,立即返回。是的,这也是我想到的解决方案之一,即在服务中创建一个netty客户端,并向服务器发送特殊消息/事件,以便根据meesage/事件替换管道中的处理程序。但最终,我还是想知道netty中是否有一些架构机制来实现它。如果是否定的,我必须使用这些非架构解决方案。您必须访问管道。也许您可以将管道存储在与用户共享的外部对象中?然后在初始值设定项的构造函数中,传递此对象并将管道设置为此对象。然后您可以直接在Netty环境之外进行操作。我是否可以确认您的意思是我可以通过
    ServerBootstrap.register().channel().pipeline()获取
    ChannelPipeline
    ?我在调用
    ServerBootstrap.childHandler(…)
    之后和
    ServerBootstrap.bind().sync()
    之前尝试了该方法,但新的处理程序似乎没有添加到管道中。