netty inactive一直被觸發,netty channelinactive觸發條件_Netty的Future和Promise

 2023-10-04 阅读 28 评论 0

摘要:在應用中以任務的方式實現功能時,需要考慮到任務間的依賴關系。當任務強依賴上一個任務的結果時,任務間的消息通知就需要重視起來。任務間的消息通知分為同步和異步方式,同步就是消息的發送方要等待消息返回才能繼續處理其他事情,而異步就是不需

在應用中以任務的方式實現功能時,需要考慮到任務間的依賴關系。當任務強依賴上一個任務的結果時,任務間的消息通知就需要重視起來。任務間的消息通知分為同步和異步方式,同步就是消息的發送方要等待消息返回才能繼續處理其他事情,而異步就是不需要等待消息返回而是通過條件變量、信號量、回調等方式實現消息通知。

39254c4b9fccbbaadcb651bff784f463.png

JDK提供了 Future 來表示一個任務的執行結果。實現一個任務時需要實現 RunnableCallable 結果,Future 可以檢測任務是否完成,獲取任務的執行結果,取消任務等。Future 是一個任務的句柄,從Future 可以獲取任務的狀態和執行結果,即使這個結果可能立即可用或者未來某個時間可用。Promise 是一個可以寫入結果或異常的對象,只能寫入一次。Promise 表示 Future 的執行結果,成功或者異常。每個 Promise 關聯一個 Future,對 Promise 進行寫入會使 Future 的值可用。

Future和Promise來源于函數式語言,其目的是分離一個值和產生值的方法,從而簡化異步代碼的處理。

Netty中的Future

因為JDK的 Future 支持的功能比較簡陋,Netty提供了 Future 的實現,擴展了 Future 的功能。

Netty中關于 Future 框架的實現位于 common 模塊中,至于在 transport 中的擴展如 ChannelFuture這里沒有涉及,那部分內容只是 Future 的應用。

5de8da7e6c2e51492bb62f945058e581.png

從IDEA生成的類圖來看Netty的關于 Future 的擴展有三類:

  1. Future -> AbstractFuture -> CompleteFuture -> FailedFuture,SucceededFuture。針對只需要關注任務的最終執行結果,中間不需要對任務執行成功或異常設置回調。AbstractFuture 提供了 get() 操作的實現,CompleteFuture 代表一個執行完畢的任務結果或異常。

1933ff0a04e3922e2f1af08a579fdddb.png

  1. Netty的 Future 實現增加了添加和移除回調的方法,從而實現異步編程,回調或者說事件通知的實現是基于觀察者模式。Future也支持同步獲取結果,但是JDK的 Futureget() 操作從語義上來說是一個獲取結果的方法,如果不是閱讀文檔完全獲取不到這個方法會阻塞線程直到能夠成功獲取結果或拋出異常。Netty提供了 await()sync() 方法阻塞當前線程直到結果完成,從語義上來說 await() 用作需要等待任務完成,但是不需要獲取任務執行結果或無結果,sync() 用作需要同步阻塞且需要獲取結果的場景,當 sync() 執行結束后調用 get() 獲取執行結果。

    Netty的 Promise 實現是通過繼承 Future 實現的,在 Promise 中提供了設置任務執行結果的方法。在 DefaultPromise 中提供了實現,關于回調的實現是一個觀察者模式的實現。在Netty的監聽器接口的頂層接口是JDK的 EventListener 接口,這是JDK的事件通知接口,相關的還有事件對象的類定義 EventObject。值得注意的是回調地獄的問題,Netty默認回調的嵌套上限是8層。JDK8提供的 CompletableFuture 支持對 Future 進行計算,而不是 Future的結果從而解決了開發中需要用到的多重回調問題。

    9801de366d6d80c4665227df7adaddb0.png

  2. Netty還提供了ProgressiveFutureProgressivePromise 抽象,這是為了解決任務處理不同的階段需要進行不同的處理的問題,如下載任務,需要不斷反饋下載進度,又或者如支持依賴的調度任務進行到不同階段需要觸發不同的任務執行。ProgressivePromise 主要增加了setProgress()tryProgress() 方法。

    dcd39b6507dda651f147a829eaa10554.png

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/1/112951.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息