dubbo異步調用三種方式
異步通訊對於服務端響應時間較長的方法是必須的,能夠有效地利用客戶端的資源,在dubbo中,消費端<dubbp:method>通過 async="true"標識。
<dubbo:reference id="xxx" ....>
<dubbo:method name="method1" async="true" />
</dubbo:reference>
具體有三種方式:
1、NIO future主動獲取結果,返回結果放在RpcContext中
需要註意的是,由於RpcContext是單例模式,所以每次調用完後,需要保存一個Future實例;如:
fooService.findFoo(fooId);
Future<Foo> fooFuture = RpcContext.getContext().getFuture();
barService.findBar(barId);
Future<Bar> barFuture = RpcContext.getContext().getFuture();
barService.findBar(barId);
Bar bar = barFuture.get();
2、通過回調(Callback)參數
Callback並不是dubbo內部類或接口,而是由應用自定義的、實現了Serializable的接口;
分兩步:1)服務提供者需在方法中聲明Callback參數,其後在Service實現中顯示地調用Callback的方法;
<dubbo:service ..>
<dubbo:method name="method1">
<dubbo:argument index="1" callback="true" /> #標識第二個參數是callback類型
</dubbo:method>
2)Callback接口的實現類在消費端,當方法發生調用時,消費端會自動export一個Callback服務,在Rpc調用完成後,不能立即結束線程。
<dubbo:reference ...>
<dubbo:method name="method1" async="true">
</dubbo:reference>
3、事件通知(推薦)
這種方式更簡單,對服務提供方來講是透明的,包括配置和代碼上,均無需做任何改動。
消費端定義一個“通知者”的Spring Bean,指定方法的onreturn和onthrow事件action就可以。
<bean id="notify" class="com.alibaba.dubbo.callback.implicit.NofifyImpl" />
<dubbo:reference >
<dubbo:method name="method1" async="true" onreturn="notify.onreturn" onthrow="notify.onthrow" />
</dubbo:reference>
dubbo異步調用三種方式