一個定義良好并具有擴(kuò)展能力的事件模型是事件驅(qū)動開發(fā)的必要條件。Netty 具有定義良好的 I/O 事件模型。由于嚴(yán)格的層次結(jié)構(gòu)區(qū)分了不同的事件類型,因此 Netty 也允許你在不破壞現(xiàn)有代碼的情況下實現(xiàn)自己的事件類型。這是與其他框架相比另一個不同的地方。很多 NIO 框架沒有或者僅有有限的事件模型概念;在你試圖添加一個新的事件類型的時候常常需要修改已有的代碼,或者根本就不允許你進(jìn)行這種擴(kuò)展。
在一個 ChannelPipeline 內(nèi)部一個 [ChannelEvent]() 被一組ChannelHandler 處理。這個管道是 Intercepting Filter (攔截過濾器)模式的一種高級形式的實現(xiàn),因此對于一個事件如何被處理以及管道內(nèi)部處理器間的交互過程,你都將擁有絕對的控制力。例如,你可以定義一個從 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);
}
}
同時你也可以定義一種操作響應(yī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)事件模型的更多信息,請參考 API 文檔 ChannelEvent 和ChannelPipeline 部分。
更多建議: