非同步通訊對於服務端響應時間較長的方法是必須的,能夠有效地利用客戶端的資源,在dubbo中,消費端通過 async="true"標識。
具體有三種方式:
1、nio future主動獲取結果,返回結果放在rpccontext中
需要注意的是,由於rpccontext是單例模式,所以每次呼叫完後,需要儲存乙個future例項;如:
fooservice.findfoo(fooid);
futurefoofuture = rpccontext.getcontext().getfuture();
barservice.findbar(barid);
futurebarfuture = rpccontext.getcontext().getfuture();
barservice.findbar(barid);
bar bar = barfuture.get();
2、通過**(callback)引數
callback並不是dubbo內部類或介面,而是由應用自定義的、實現了serializable的介面;
分兩步:1)服務提供者需在方法中宣告callback引數,其後在service實現中顯示地呼叫callback的方法;
#標識第二個引數是callback型別
2)callback介面的實現類在消費端,當方法發生呼叫時,消費端會自動export乙個callback服務,在rpc呼叫完成後,不能立即結束執行緒。
3、事件通知(推薦)
這種方式更簡單,對服務提供方來講是透明的,包括配置和**上,均無需做任何改動。
消費端定義乙個「通知者」的spring bean,指定方法的onreturn和onthrow事件action就可以。
SCA程式設計模式三種方式的非同步呼叫
我們知道,常見的方法呼叫都是同步呼叫,這種呼叫方式是一種阻塞式的呼叫方式,即客戶端 主呼叫方 一直阻塞等待直到被服務端 被呼叫方 返回 為止。這種呼叫方式相對比較直觀,也是大部分程式語言直接支援的一種呼叫方式。但是,如果我們面對是基於粗粒度的服務元件,面對的是一些需要比較長時間才 能有響應的應用場景...
Spring中非同步呼叫的三種實現方式
設定超時時間 asynccontext.settimeout 20000 asynccontext.start new runnable catch exception e 非同步請求完成通知 此時整個請求才完成 asynccontext.complete 此時之類 request的執行緒連線已經釋...
Dubbo 同步 非同步呼叫的幾種方式
我們知道,dubbo 預設協議採用單一長連線,底層實現是 netty 的 nio 非同步通訊機制 基於這種機制,dubbo 實現了以下幾種呼叫方式 同步呼叫是一種阻塞式的呼叫方式,即 consumer 端 一直阻塞等待,直到 provider 端返回為止 通常,乙個典型的同步呼叫過程如下 consu...