鍍金池/ 教程/ Java/ 基于攔截鏈模式的事件模型
Netty 實(shí)現(xiàn) WebSocket 聊天功能
總結(jié)
寫個(gè)時(shí)間客戶端
寫個(gè)丟棄服務(wù)器
問(wèn)題
開(kāi)始之前
關(guān)閉你的應(yīng)用
開(kāi)始
用POJO代替ByteBuf
總結(jié)
架構(gòu)總覽
豐富的緩沖實(shí)現(xiàn)
解決
寫個(gè)應(yīng)答服務(wù)器
I/O API 統(tǒng)一的異步 I/O API
適用快速開(kāi)發(fā)的高級(jí)組件
處理一個(gè)基于流的傳輸
Netty 實(shí)現(xiàn)聊天功能
基于攔截鏈模式的事件模型
寫個(gè)時(shí)間服務(wù)器
查看收到的數(shù)據(jù)

基于攔截鏈模式的事件模型

一個(gè)定義良好并具有擴(kuò)展能力的事件模型是事件驅(qū)動(dòng)開(kāi)發(fā)的必要條件。Netty 具有定義良好的 I/O 事件模型。由于嚴(yán)格的層次結(jié)構(gòu)區(qū)分了不同的事件類型,因此 Netty 也允許你在不破壞現(xiàn)有代碼的情況下實(shí)現(xiàn)自己的事件類型。這是與其他框架相比另一個(gè)不同的地方。很多 NIO 框架沒(méi)有或者僅有有限的事件模型概念;在你試圖添加一個(gè)新的事件類型的時(shí)候常常需要修改已有的代碼,或者根本就不允許你進(jìn)行這種擴(kuò)展。

在一個(gè) ChannelPipeline 內(nèi)部一個(gè) [ChannelEvent]() 被一組ChannelHandler 處理。這個(gè)管道是 Intercepting Filter (攔截過(guò)濾器)模式的一種高級(jí)形式的實(shí)現(xiàn),因此對(duì)于一個(gè)事件如何被處理以及管道內(nèi)部處理器間的交互過(guò)程,你都將擁有絕對(duì)的控制力。例如,你可以定義一個(gè)從 socket 讀取到數(shù)據(jù)后的操作:

    public class MyReadHandler implements SimpleChannelHandler {
         public void messageReceived(ChannelHandlerContext ctx, MessageEvent evt) {
             Object message = evt.getMessage();
             // Do something with the received message.
                ...

             // And forward the event to the next handler.
             ctx.sendUpstream(evt);
        }
    }

同時(shí)你也可以定義一種操作響應(yīng)其他處理器的寫操作請(qǐng)求:

    public class MyWriteHandler implements SimpleChannelHandler {
        public void writeRequested(ChannelHandlerContext ctx, MessageEvent evt) {
            Object message = evt.getMessage();
            // Do something with the message to be written.
                ...

            // And forward the event to the next handler.
            ctx.sendDownstream(evt);
        }
    }

有關(guān)事件模型的更多信息,請(qǐng)參考 API 文檔 ChannelEvent 和ChannelPipeline 部分。

上一篇:問(wèn)題下一篇:用POJO代替ByteBuf