Netty 动态变化的网状管道

Netty 动态变化的网状管道,netty,Netty,我正在使用netty 4.0.25Final编写一个netty HTTP服务器。我需要根据HTTP GET请求中的一些参数在管道中添加各种处理程序 pipeline.addLast(new HttpRequestDecoder(4096, 8192, 8192, false), new HttpResponseEncoder(), new HttpObjectAggregator(1048576),

我正在使用netty 4.0.25Final编写一个netty HTTP服务器。我需要根据HTTP GET请求中的一些参数在管道中添加各种处理程序

pipeline.addLast(new HttpRequestDecoder(4096, 8192, 8192, false),
                 new HttpResponseEncoder(),
                 new HttpObjectAggregator(1048576),
                 decisionHandler
                 );
如果多个请求来自同一连接,则使用相同的管道。Request1可能需要Handler1,Request2可能需要Handler2,Request3可能需要Handler3。假设请求以Request1、Request2、Request3的形式出现。Request1将修改管道以添加Handler1

  • 在随后的调用中,我们是否总是需要检查pipleline是否已被修改,然后删除不需要的处理程序?然后添加处理该特定调用所需的必需处理程序

  • 或者我应该在转到下一个处理程序(fireChannelRead(object))之前删除该处理程序吗?它会对性能产生影响吗

  • 还有别的办法吗

  • 谢谢和问候


    Tanima动态操作管道是一项相对昂贵的操作。如果您试图实现的只是一个简单的交换用例,比如委托,那么您可以编写一个处理程序来实现它。例如:

    公共类SwitchCaseHandler扩展了ChannelInboundHandlerAdapter{
    专用最终通道BoundHandler handler1=。。。;
    专用最终通道BoundHandler handler2=。。。;
    专用最终通道BoundHandler handler3=。。。;
    ...
    @凌驾
    公共无效信道读取(ctx、msg){
    如果(isForHandler1(msg)){
    handler1.channelRead(ctx,msg);
    }否则如果(isForHandler2(msg)){
    handler2.channelRead(ctx,msg);
    } ...
    }
    }
    
    请注意,
    handler[1 | 2 | 3]
    实际上不需要是
    ChannelInboundHandler
    。您可以定义一个非常简单的接口,如下所示:

    公共接口ChannelMessageHandler{
    void channelRead(ChannelHandlerContext ctx,Object msg)抛出异常;
    }
    
    你能试着帮我回答以下问题吗