动态更改Netty管道

4

我正在使用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。
  1. 在后续调用中,我们是否总是需要检查管道是否已经被修改,然后删除不需要的处理程序?然后添加所需的处理程序,以处理该特定调用?
  2. 还是应该在转到下一个处理程序(fireChannelRead(object))之前删除处理程序?这会对性能产生影响吗?
  3. 还有其他方法吗?
谢谢和问候,
Tanima
1个回答

14

动态操作流水线是一个比较昂贵的操作。如果您要实现的仅是类似于选择语句的简单委托,您可以编写一个处理程序来完成。例如:

public class SwitchCaseHandler extends ChannelInboundHandlerAdapter {

    private final ChannelInboundHandler handler1 = ...;
    private final ChannelInboundHandler handler2 = ...;
    private final ChannelInboundHandler handler3 = ...;
    ...

    @Override
    public void channelRead(ctx, msg) {
        if (isForHandler1(msg)) {
            handler1.channelRead(ctx, msg);
        } else if (isForHandler2(msg)) {
            handler2.channelRead(ctx, msg);
        } ...
    }
}
请注意,handler [1 | 2 | 3]实际上不需要是ChannelInboundHandler。您可以定义一个非常简单的接口,如下所示:
public interface ChannelMessageHandler {
    void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception;
}

你能否帮我解答以下问题:https://stackoverflow.com/questions/66066914/netty-buffering-inbound-data-until-i-have-enough-data-to-execute-some-logic - Haim Raman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接