动态改变网络管道

时间:2015-03-02 07:12:51

标签: netty

我使用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. 在后续调用中,我们是否始终需要检查pipleline是否已被修改,然后删除不需要的处理程序?然后添加处理该特定调用所需的处理程序?

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

  3. 还有其他办法吗?

  4. 谢谢&的问候,

    Tanima

1 个答案:

答案 0 :(得分:10)

动态操作管道是相对昂贵的操作。如果您尝试实现的只是一个简单的切换案例,例如委托,您可以编写一个执行该操作的处理程序。例如:

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;
}