1. 程式人生 > >dubbo異步調用三種方式

dubbo異步調用三種方式

需要 lib oos 通知 ext.get action con 主動 bean

異步通訊對於服務端響應時間較長的方法是必須的,能夠有效地利用客戶端的資源,在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>

</dubbo:service>

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異步調用三種方式