dubbo之異步調用


異步調用

基於 NIO 的非阻塞實現並行調用,客戶端不需要啟動多線程即可完成並行調用多個遠程服務,相對多線程開銷較小。

在 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> 

調用代碼:

// 此調用會立即返回null fooService.findFoo(fooId); // 拿到調用的Future引用,當結果返回后,會被通知和設置到此Future Future<Foo> fooFuture = RpcContext.getContext().getFuture(); // 此調用會立即返回null barService.findBar(barId); // 拿到調用的Future引用,當結果返回后,會被通知和設置到此Future Future<Bar> barFuture = RpcContext.getContext().getFuture(); // 此時findFoo和findBar的請求同時在執行,客戶端不需要啟動多線程來支持並行,而是借助NIO的非阻塞完成 // 如果foo已返回,直接拿到返回值,否則線程wait住,等待foo返回后,線程會被notify喚醒 Foo foo = fooFuture.get(); // 同理等待bar返回 Bar bar = barFuture.get(); // 如果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" />


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM