Netty中ChannelPipeline和ChannelHandler的關係
ChannelPipeline為ChannelHandler鏈提供了容器,並定義了用於在該鏈上傳播入站和出站事件流的API。當Channel被建立時,它會被自動地分配到它專屬的ChannelPipeline。
ChannelHandler安裝到ChannelPipeline中的過程:
- 一個ChannelInitializer的實現被註冊到了ServerBootstrap(或者用於客戶端的Bootstrap)中。
- 當ChannelInitializer.initChannel()方法被呼叫時,ChannelInitializer將在ChannelPipeline中安裝一組自定義的ChannelHandler;
- ChannelInitialier將它自己從ChannelPipeline中移除。
ChannelHandler是專為支援廣泛的用途而設計的,可以將它看作是處理往來ChannelPipeline事件(包括資料)的何程式碼的通用容器。
使得事件流經ChannelPipeline是ChannelHandler的工作,它們是在應用程式的初始化或者引導階段被安裝的。這些物件接收事件、執行它們所實現的處理邏輯,並將資料傳遞給鏈中的下一個ChannelHandler。它們的執行順序是由它們被新增的順序所決定的。實際上被我們稱為ChannelPipeline的是這些ChannelHandler的編排順序。
從一個客戶端應用程式的角度來看,如果事件的運動方向是從客戶端到伺服器,那麼我們稱這些事件為出站的,反之則成為入站的(我的理解:ChannelPipeline就是這個站,從客戶端到伺服器叫出站,從伺服器到客戶端叫入站)。入站和出站的ChannelHandler可以被安裝到同一個ChannelPipeline中。如果一個訊息或者任何其他的入站事件被讀取,那麼它會從ChannelPipeline的頭部開始流動,並被傳遞給第一個ChannelInBoundHandler。這個ChannelHandler不一定會實際地修改資料,具體取決於它的具體功能,在這之後,資料將會被傳遞給鏈中的下一個ChannelInboundHandler。最終資料會到達ChannelPipeline的尾端,屆時所有處理就都結束了。
資料的出站運動在概念上也是一樣的。資料將從ChannelOutboundHandler鏈的尾端開始流動,直到它到達鏈的頭部為止。在這之後出站資料將會到達網路傳輸層(Socket),通常情況下這裡將觸發一個寫操作。
通過使用作為引數傳遞到每個方法的ChannelHandlerContext,事件可以被傳遞給當前ChannelHandler鏈中的下一個ChannelHandler。