異步調用
基於 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" />