2015-03-02 93 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; 
}