Netty剖析之Netty異步模型

異步模型基本介紹

  1. 異步的概念和同步相對,當一個異步過程調用發出後,調用者不能立刻得到結果。實際處理這個調用的組件在完成後,通過狀態、通知、回調來通知調用者。
  2. Netty中IO操作是異步的,包括Bind,write,connect等操作會簡單的返回一個channelFuture
  3. 調用者並不能立刻獲得結果,而是通過Future-Listener機制,用戶可以方便的主動獲取或者通過通知機制獲得IO操作結果
  4. Netty的異步模型是建立在future和callback之上的。callback就是回調,future的核心思想是:假設有一個方法執行非常耗時,等待這個方法執行完再返回結果,顯然是不合適的,那麼就可以在調用此方法的時候,立馬返回一個future,後續可以通過future去監控方法的處理過程,即Future-Listener機制

Future介紹

  1. 表示異步的執行結果,可以通過它提供的方法來檢測執行是否完成,比如檢索計算等等
  2. channelFuture是一個接口(public interface ChannelFuture extends Future),我們可以手動添加監聽器,當監聽的事件發生時,就會通知到監聽器

示意圖:
在這裏插入圖片描述
目的:

  1. 再使用Netty進行編碼時,攔截操作和轉換出入站數據只需要提供callback和利用future即可,這使得鏈式操作簡單、高效、並有利於編寫可重用的、通用的代碼
  2. Netty框架的目標就是讓你的業務邏輯從網絡基礎應用編碼中分離出來,解脫處理

Future-Listener機制

當future對象剛剛創建時,處於非完成狀態,調用者可以通過返回的channelFuture來獲取操作執行的狀態,註冊監聽函數來執行完成後的操作

常見的操作:

  1. 通過isDone方法來判斷當前操作是否完成
  2. 通過isSuccess方法來判斷已完成的當前操作是否成功
  3. 通過getCause方法來獲取已完成的當前操作失敗的原因
  4. 通過isCancelled方法來判斷已完成的當前操作是否被取消
  5. 通過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對象,即可註冊監聽器

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章