dubbo 異步化實踐

@DubboService
public class AsyncOrderFacadeImpl implements AsyncOrderFacade {private Logger logger = LoggerFactory.getLogger(AsyncOrderFacadeImpl.class);// 構建線程池ThreadPoolExecutor threadPoolExecutor= new ThreadPoolExecutor(1000, 1000, 10, TimeUnit.SECONDS, new ArrayBlockingQueue<>(1024));@Overridepublic OrderInfo queryOrderById(String id) {// 開啟異步化操作模式,標識異步化模式開啟AsyncContext asyncContext = RpcContext.startAsync();threadPoolExecutor.submit(() -> {// 同步queryOrderById方法所在的線程上下文信息到當前的子線程中asyncContext.signalContextSwitch();try {TimeUnit.MILLISECONDS.sleep(50);} catch (InterruptedException e) {throw new RuntimeException(e);}// 使用asyncContext將結果返回asyncContext.write(new OrderInfo("GeekDubbo", "服務方異步方式之RpcContext.startAsync#" + id, new BigDecimal(2000)));logger.info("-------------- end --------------");});return null;}
}

org.apache.dubbo.rpc.RpcContext#startAsync

public static AsyncContext startAsync() throws IllegalStateException {// 獲取上下文對象RpcContext currentContext = getContext();// AsyncContext 是Dubbo服務提供者端實現的異步處理的核心接口,用于將同步調用轉為異步執行if (currentContext.asyncContext == null) {// 獲取Dubbo上下文currentContext.asyncContext = new AsyncContextImpl();}// 創建CompletableFuture實例currentContext.asyncContext.start();return currentContext.asyncContext;
}

org.apache.dubbo.rpc.AsyncContextImpl

/*** 初始化上下文實例*/
public AsyncContextImpl() {// 獲取當前線程綁定的RpcContext實例,包含請求和響應雙向信息// 跨服務參數透傳:消費端設置隱式參數,提供端通過getAttachment獲取// 異步調用管理:通過getCompletableFuture()處理異步結果(消費端)或延遲寫入響應(提供端)this.storedContext = RpcContext.getContext();// 獲取服務端特有的響應上下文,用于回傳數據(dubbo3.x中廢棄,使用getServiceContext())]// 服務端響應附件元數據:服務端處理完成后,通過setAttachment回傳簽名,加密令牌等數據this.storedServerContext = RpcContext.getServerContext();
}

org.apache.dubbo.rpc.AsyncContextImpl#start

public void start() {if (this.started.compareAndSet(false, true)) {// 創建CompletableFuture實例// 該對象用于非阻塞式任務編排,支持鏈式調用和組合操作,簡化多線程開發復雜度this.future = new CompletableFuture<>();}
}

org.apache.dubbo.rpc.AsyncContextImpl#signalContextSwitch

/*** 將主線程中的上下文對象同步到當前線程上下文中*/
@Override
public void signalContextSwitch() {RpcContext.restoreContext(storedContext);RpcContext.restoreServerContext(storedServerContext);// Restore any other contexts in here if necessary.
}

org.apache.dubbo.rpc.AsyncContextImpl#write

 @Overridepublic void write(Object value) {if (isAsyncStarted() && stop()) {if (value instanceof Throwable) {Throwable bizExe = (Throwable) value;future.completeExceptionally(bizExe);} else {// 將結果寫回future.complete(value);}} else {throw new IllegalStateException("The async response has probably been wrote back by another thread, or the asyncContext has been closed.");}}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/77961.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/77961.shtml
英文地址,請注明出處:http://en.pswp.cn/web/77961.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

CSS3布局方式介紹

CSS3布局方式介紹 CSS3布局(Layout)系統是現代網頁設計中用于構建頁面結構和控制元素排列的一組強大工具。CSS3提供了多種布局方式,每種方式都有其適用場景,其中最常用的是Flexbox和CSS Grid。 先看傳統上幾種布局方式,再較詳細的介紹現代布局方式Flexbox和CSS Grid。 傳…

MoonBit支持國產芯片開發--性能媲美C

MoonBit支持國產芯片開發–性能媲美C 在 ESP32-C3 上實現生命游戲 過去&#xff0c;我們曾在文章《硬件實現&#xff1a;在ESP32-C6單片機上運行MoonBit WASM-4小游戲》中&#xff0c;展示了如何通過 WebAssembly (WASM) 將 MoonBit 程序移植到物理硬件&#xff0c;初步探索其…

【RAG 框架部署】LangChain-Chatchat (原 Langchain-ChatGLM) + Ollama

目錄 前言 一、什么是RAG&#xff1f; 二、環境準備和Ollama搭建 1、conda虛擬環境配置 2、Ollama搭建 三、LangChain-Chatchat搭建 1、框架安裝 2、文件配置 3、初始化知識庫 4、啟動Langchan-Chatchat 前言 由于LangChain-Chatchat的 0.3.0 版本已修改為支持不同模…

python對接馬來西亞股票完整代碼

StockTV全球股票數據API對接實戰&#xff1a;構建智能金融分析系統 一、StockTV API核心功能解析 StockTV作為覆蓋200國家證券市場的數據平臺&#xff0c;其API提供三大核心模塊的對接能力&#xff1a; 市場列表查詢 - 獲取指定國家的股票基礎數據個股詳情檢索 - 查詢實時行情…

普通IT的股票交易成長史--20250430晚

聲明&#xff1a;本文章的內容只是自己學習的總結&#xff0c;不構成投資建議。文中觀點基本來自yt站Andylee&#xff0c;美股Alpha姐&#xff0c;綜合自己的觀點得出。感謝他們的無私分享。 送給自己的話&#xff1a; 倉位就是生命&#xff0c;絕對不能滿倉&#xff01;&…

windows 下 oracle 數據庫的備份與還原

1、備份 創建備份出來的文件存放的位置。 創建目錄對象&#xff0c;在數據庫中創建一個目錄對象&#xff0c;該對象指向文件系統中用于存儲導出文件的實際目錄&#xff08; sql 命令&#xff0c;可以在 plsql 中執行&#xff09;。 -- 創建目錄對象&#xff0c;\D:\Oracle19c\…

基于單片機的智能藥盒系統

標題:基于單片機的智能藥盒系統 內容:1.摘要 本文聚焦于基于單片機的智能藥盒系統。背景方面&#xff0c;隨著人口老齡化加劇&#xff0c;老年人按時準確服藥問題愈發凸顯&#xff0c;同時現代快節奏生活也使人們容易遺忘服藥時間。目的是設計并實現一個能幫助人們按時、按量服…

“100% 成功的 PyTorch CUDA GPU 支持” 安裝攻略

#工作記錄 一、總述 在深度學習領域&#xff0c;PyTorch 憑借其靈活性和強大的功能&#xff0c;成為了眾多開發者和研究者的首選框架。而 CUDA GPU 支持能夠顯著加速 PyTorch 的計算過程&#xff0c;大幅提升訓練和推理效率。然而&#xff0c;安裝帶有 CUDA GPU 支持的 PyTor…

圖數據庫榜單網站

圖數據庫榜單 https://db-engines.com/en/ranking/graphdbms點擊跳轉

Android Jetpack Compose 面試題大全(2025最新整理)

基礎概念 什么是 Jetpack Compose&#xff1f;它與傳統 Android UI 開發有何不同&#xff1f; Compose 是 Android 的現代聲明式 UI 工具包&#xff0c;使用 Kotlin 編寫不同于傳統的基于 View 和 XML 的 imperative 方式&#xff0c;Compose 使用聲明式范式主要區別&#xff1…

添加了addResourceHandlers 但沒用

B站黑馬的視頻 public class WebMvcConfig extends WebMvcConfigurationSupport { /** * 設置靜態資源映射 * param registry */ Override protected void addResourceHandlers(ResourceHandlerRegistry registry) { log.info("開始進…

STM32實現simpleFOC控制無刷電機

一、FOC基礎知識學習 使用simpleFOC控制無刷電機前&#xff0c;需要大概了解一下相關知識&#xff0c;包括力矩控制、速度控制、位置控制的原理和它們之間的聯系。 推薦學習資料&#xff1a; 教你寫一個比SimpleFOC更好的電機庫_嗶哩嗶哩_bilibili 《燈哥手把手教你寫FOC算…

【數據結構】快慢指針

一、快慢指針的原理 定義&#xff1a; 快指針&#xff1a;每次移動兩步 慢指針&#xff1a;每次移動一步 終止條件&#xff1a; 當快指針到達鏈表末尾時停止 事件復雜度&#xff1a; 始終為O(n),僅需依次遍歷 空間復雜度&#xff1a; …

畢業論文 | 基于STM32的自動煙霧報警系統設計

基于STM32的煙霧報警系統 一、系統設計原理1. **系統架構**2. **工作原理**二、核心公式與算法1. **MQ-2傳感器濃度計算**2. **溫度傳感器數據處理**3. **校準與濾波**三、關鍵代碼實現1. **ADC初始化與數據讀取(以MQ-2為例)**2. **報警邏輯與閾值設置**3. **EEPROM存儲閾值*…

Android Gradle插件開發

文章目錄 1. Gradle插件是什么2. 為什么需要插件3. 編寫插件位置4. 編寫插件5. 自定義插件擴展5.1 訂閱擴展對象5.2 把擴展添加給Plugin并使用5.3 配置參數5.4 嵌套擴展5.4.1 定義擴展5.4.2 獲取擴展屬性5.4.3 使用5.4.4 執行5.4.5 輸出 6. 編寫在單獨項目里6.1 新建Module6.2 …

PPIO X OWL:一鍵開啟任務自動化的高效革命

2024年&#xff0c;僅憑一PPIO X OWL&#xff1a;一鍵開啟任務自動化的高效革命篇技術論文&#xff0c;OWL的Github倉庫便在24小時斬獲了15k Star&#xff0c;成為2024年增速最快的多智能體協作框架&#xff0c;重新定義了任務自動化的效率邊界。Camel AI團隊開源全棧方案&…

分布式事務,事務失效,TC事務協調者

1. 概述 本方案書旨在解決分布式系統中事務一致性問題&#xff0c;重點闡述全局事務標識&#xff08;XID&#xff09;的傳遞與存儲機制、事務協調者&#xff08;TC&#xff09;的設計與部署&#xff0c;以及分布式事務失效場景的應對策略。基于業界成熟框架&#xff08;如Seat…

2025年“深圳杯”數學建模挑戰賽D題-法醫物證多人身份鑒定問題

法醫物證多人身份鑒定問題 小驢數模 犯罪現場法醫物證鑒定是關系到國家安全、公共安全、人民生命財產安全和社會穩定的重大問題。目前法醫物證鑒定依賴DNA分析技術不斷提升。DNA檢驗的核心是STR&#xff08;Short Tandem Repeat&#xff0c;短串聯重復序列&#xff09;分析技術…

Mysql查詢異常【Truncated incorrect INTEGER value】

文章目錄 異常原因分析1、數據類型不一致2、數據長度超長3、數據格式要正確 處理方案模擬案例創建表數據查詢 異常 在執行MySQL的語句時&#xff0c;在控制臺報錯如下所示。 Data truncation: Truncated incorrect INTEGER value 原因分析 1、數據類型不一致 必須要保證數據…

WPF性能優化舉例

WPF性能優化集錦 一、UI渲染性能優化 1. 虛擬化技術 ??ListView/GridView虛擬化??: <ListView VirtualizingStackPanel.IsVirtualizing="True"VirtualizingStackPanel.VirtualizationMode="Recycling"ScrollViewer.IsDeferredScrollingEnabled=…