gpt4 book ai didi

netty - 动态变化的 netty 管道

转载 作者:行者123 更新时间:2023-12-04 22:20:10 43 4
gpt4 key购买 nike

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

  • 感谢和问候,

    谷间

    最佳答案

    动态操作管道是一项相对昂贵的操作。如果您尝试实现的只是一个简单的 switch-case(如委托(delegate)),您可以编写一个处理程序来执行此操作。例如:

    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真的。您可以定义一个非常简单的接口(interface),如下所示:

    public interface ChannelMessageHandler {
    void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception;
    }

    关于netty - 动态变化的 netty 管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28804413/

    43 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com