2016-12-26 128 views
0

如何做網狀如下:的Netty和多處理器

  1. 如果URI開始 「/靜態/ *」 路徑中使用StaticHttpHandler
  2. 如果其他URI使用的HttpHandler
  3. 如果 「/ WS」 使用WebSocketHandler

現在我有這樣的代碼:

public class HttpHelloWorldServerInitializer extends ChannelInitializer<SocketChannel> { 
    @Override 
    public void initChannel(SocketChannel ch) { 
     ChannelPipeline p = ch.pipeline(); 
     p.addLast(new HttpServerCodec()); 
     p.addLast(new HttpHandler()); 

     // Other pipelene handlers? 
    } 
} 

我可以在管道中使用諸如「swither」之類的東西嗎?或者它沒有意義,我需要處理處理程序中的請求uri。但如何確定websocket協議?

回答

1

在你自己的HttpHandler中,你必須首先檢查uri,然後決定運行哪個「真實」處理程序。要做到這一點,2種方式做的:

  • 無論你在你的業務代碼有(HttpHandler的)已經alocated或新分配(StaticHttpHandler和WebSocketHandler),然後通過調用其手動將請求傳遞給他們必要的對象明確地(因此它們不再是「標準的」Netty處理程序)
  • 要麼你有一個特定的處理程序(例如HttpRouteHandler)決定將哪個處理程序添加到該請求的管道中,並傳遞給下一個當前請求

第一個最簡單但不容易擴展。

第二個有點困難,你必須確保/清理每個請求正在到達正確的處理程序。例如,

  • 一旦一個通道連接,是否所有請求都進入它的性質?如果是這樣,那麼你可以安全地添加必要的處理程序,甚至刪除HttpRouteHandler。
  • 如果沒有,那麼對於每個請求,你必須決定添加/根據需要進行刪除必要的處理,保持HttpRouteHandler在管道來處理新形勢下

說它短,你想在Web服務中實現路由解析。