異步模型基本介紹
- 異步的概念和同步相對,當一個異步過程調用發出後,調用者不能立刻得到結果。實際處理這個調用的組件在完成後,通過狀態、通知、回調來通知調用者。
- Netty中IO操作是異步的,包括Bind,write,connect等操作會簡單的返回一個channelFuture
- 調用者並不能立刻獲得結果,而是通過Future-Listener機制,用戶可以方便的主動獲取或者通過通知機制獲得IO操作結果
- Netty的異步模型是建立在future和callback之上的。callback就是回調,future的核心思想是:假設有一個方法執行非常耗時,等待這個方法執行完再返回結果,顯然是不合適的,那麼就可以在調用此方法的時候,立馬返回一個future,後續可以通過future去監控方法的處理過程,即Future-Listener機制
Future介紹
- 表示異步的執行結果,可以通過它提供的方法來檢測執行是否完成,比如檢索計算等等
- channelFuture是一個接口(public interface ChannelFuture extends Future),我們可以手動添加監聽器,當監聽的事件發生時,就會通知到監聽器
示意圖:
目的:
- 再使用Netty進行編碼時,攔截操作和轉換出入站數據只需要提供callback和利用future即可,這使得鏈式操作簡單、高效、並有利於編寫可重用的、通用的代碼
- Netty框架的目標就是讓你的業務邏輯從網絡基礎應用編碼中分離出來,解脫處理
Future-Listener機制
當future對象剛剛創建時,處於非完成狀態,調用者可以通過返回的channelFuture來獲取操作執行的狀態,註冊監聽函數來執行完成後的操作
常見的操作:
- 通過isDone方法來判斷當前操作是否完成
- 通過isSuccess方法來判斷已完成的當前操作是否成功
- 通過getCause方法來獲取已完成的當前操作失敗的原因
- 通過isCancelled方法來判斷已完成的當前操作是否被取消
- 通過addListener方法來註冊監聽器,當操作已完成,將會通知指定的監聽器
代碼示例:
// 綁定端口
ChannelFuture channelFuture = serverBootstrap.bind(8899).sync();
// 註冊監聽器
channelFuture.addListener(new ChannelFutureListener() {
@Override
public void operationComplete(ChannelFuture channelFuture) throws Exception {
if (channelFuture.isSuccess()) {
System.out.println("端口綁定成功~");
} else {
System.out.println("端口綁定失敗~");
}
}
});
只需要在你需要異步監聽結果的代碼後面調用sync方法,然後返回一個ChannelFuture對象,即可註冊監聽器