天天看點

dubbo進階應用異步調用(可以實作類似循環屏障)

dubbo進階應用異步調用(可以實作類似循環屏障)

1,消費端配置好異步調用聲明

2,調用一個異步方法馬上getfuthure,此時wait,這個有傳回後再向下調用另一個異步方法,這樣即可都完成才結束大的任務

異步就是在于不等待請求發出就向下,直接用一個建立的future等,有傳回自動會寫到future,但是要自己拿,用future拿的時候沒拿到就會等了(可設定等待時間),這樣一來利用上了主線程執行任務的時間給子線程去傳回

 // 如果foo需要5秒傳回,bar需要6秒傳回,實際隻需等6秒,即可擷取到foo和bar,進行接下來的處理。

異步調用

(+) (#)

dubbo進階應用異步調用(可以實作類似循環屏障)
基于NIO的非阻塞實作并行調用,用戶端不需要啟動多線程即可完成并行調用多個遠端服務,相對多線程開銷較小。
dubbo進階應用異步調用(可以實作類似循環屏障)
2.0.6及其以上版本支援
dubbo進階應用異步調用(可以實作類似循環屏障)

配置聲明:

consumer.xml

<

dubbo:reference

id

=

"fooService"

interface

=

"com.alibaba.foo.FooService"

>

<

dubbo:method

name

=

"findFoo"

async

=

"true"

/>

</

dubbo:reference

>

<

dubbo:reference

id

=

"barService"

interface

=

"com.alibaba.bar.BarService"

>

<

dubbo:method

name

=

"findBar"

async

=

"true"

/>

</

dubbo:reference

>

調用代碼:

fooService.findFoo(fooId);

// 此調用會立即傳回null

Future<Foo> fooFuture = RpcContext.getContext().getFuture();

// 拿到調用的Future引用,當結果傳回後,會被通知和設定到此Future。

barService.findBar(barId);

// 此調用會立即傳回null

Future<Bar> barFuture = RpcContext.getContext().getFuture();

// 拿到調用的Future引用,當結果傳回後,會被通知和設定到此Future。

// 此時findFoo和findBar的請求同時在執行,用戶端不需要啟動多線程來支援并行,而是借助NIO的非阻塞完成。

Foo foo = fooFuture.get();

// 如果foo已傳回,直接拿到傳回值,否則線程wait住,等待foo傳回後,線程會被notify喚醒。

Bar bar = barFuture.get();

// 同理等待bar傳回。

// 如果foo需要5秒傳回,bar需要6秒傳回,實際隻需等6秒,即可擷取到foo和bar,進行接下來的處理。

你也可以設定是否等待消息發出:(異步總是不等待傳回)

  • sent="true" 等待消息發出,消息發送失敗将抛出異常。
  • sent="false" 不等待消息發出,将消息放入IO隊列,即刻傳回。

    <

    dubbo:method

    name

    =

    "findFoo"

    async

    =

    "true"

    sent

    =

    "true"

    />

如果你隻是想異步,完全忽略傳回值,可以配置return="false",以減少Future對象的建立和管理成本:

<

dubbo:method

name

=

"findFoo"

async

=

"true"

return

=

"false"

/>

繼續閱讀