2015-03-02 122 views
3

我使用netty 4.0.25Final编写netty HTTP服务器。我需要在管道中添加各种处理程序,具体取决于HTTP GET请求中的一些参数。动态更改netty管道

pipeline.addLast(new HttpRequestDecoder(4096, 8192, 8192, false), 
       new HttpResponseEncoder(), 
       new HttpObjectAggregator(1048576), 
       decisionHandler 
       ); 

如果多个请求来自同一连接,则使用相同的管道。 Request1可能需要Handler1,Request2可能需要Handler2,Request3可能需要Handler3。假设请求来自请求1,请求2,请求3。 Request1会修改管道以添加Handler1。

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

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

  3. 有没有其他方法可以做到这一点?

感谢&问候,

Tanima

回答

9

动态操纵管道是相对昂贵的操作。如果你试图实现的只是一个简单的开关例如委托,你可以编写一个处理程序来做到这一点。例如:

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