W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
在 Dubbo 中發(fā)起異步調(diào)用
從 2.7.0 開(kāi)始,Dubbo 的所有異步編程接口開(kāi)始以 CompletableFuture 為基礎(chǔ)
基于 NIO 的非阻塞實(shí)現(xiàn)并行調(diào)用,客戶端不需要啟動(dòng)多線程即可完成并行調(diào)用多個(gè)遠(yuǎn)程服務(wù),相對(duì)多線程開(kāi)銷較小。
需要服務(wù)提供者事先定義 CompletableFuture 簽名的服務(wù),具體參見(jiàn)服務(wù)端異步執(zhí)行接口定義:
public interface AsyncService {
CompletableFuture<String> sayHello(String name);
}
注意接口的返回類型是? CompletableFuture<String>
?。
XML引用服務(wù):
<dubbo:reference id="asyncService" timeout="10000" interface="com.alibaba.dubbo.samples.async.api.AsyncService"/>
調(diào)用遠(yuǎn)程服務(wù):
// 調(diào)用直接返回CompletableFuture
CompletableFuture<String> future = asyncService.sayHello("async call request");
// 增加回調(diào)
future.whenComplete((v, t) -> {
if (t != null) {
t.printStackTrace();
} else {
System.out.println("Response: " + v);
}
});
// 早于結(jié)果輸出
System.out.println("Executed before response return.");
在 consumer.xml 中配置:
<dubbo:reference id="asyncService" interface="org.apache.dubbo.samples.governance.api.AsyncService">
<dubbo:method name="sayHello" async="true" />
</dubbo:reference>
調(diào)用代碼:
// 此調(diào)用會(huì)立即返回null
asyncService.sayHello("world");
// 拿到調(diào)用的Future引用,當(dāng)結(jié)果返回后,會(huì)被通知和設(shè)置到此Future
CompletableFuture<String> helloFuture = RpcContext.getContext().getCompletableFuture();
// 為Future添加回調(diào)
helloFuture.whenComplete((retValue, exception) -> {
if (exception == null) {
System.out.println(retValue);
} else {
exception.printStackTrace();
}
});
或者,你也可以這樣做異步調(diào)用:
CompletableFuture<String> future = RpcContext.getContext().asyncCall(
() -> {
asyncService.sayHello("oneway call request1");
}
);
future.get();
如果你只有這樣的同步服務(wù)定義,而又不喜歡 RpcContext 的異步使用方式。
public interface GreetingsService {
String sayHi(String name);
}
那還有一種方式,就是利用 Java 8 提供的 default 接口實(shí)現(xiàn),重載一個(gè)帶有 CompletableFuture 簽名的方法。
CompletableFuture 簽名的方法目前只支持 Dubbo 協(xié)議,其他協(xié)議由于第三方實(shí)現(xiàn)問(wèn)題,需要視具體情況而定。
有兩種方式來(lái)實(shí)現(xiàn):
public interface GreetingsService {
String sayHi(String name);
// AsyncSignal is totally optional, you can use any parameter type as long as java allows your to do that.
default CompletableFuture<String> sayHi(String name, AsyncSignal signal) {
return CompletableFuture.completedFuture(sayHi(name));
}
}
你也可以設(shè)置是否等待消息發(fā)出(異步總是不等待返回):
sent="true"
? 等待消息發(fā)出,消息發(fā)送失敗將拋出異常。sent="false"
?不等待消息發(fā)出,將消息放入 IO 隊(duì)列,即刻返回。<dubbo:method name="findFoo" async="true" sent="true" />
如果你只是想異步,完全忽略返回值,可以配置 ?return="false"
?,以減少 Future 對(duì)象的創(chuàng)建和管理成本:
<dubbo:method name="findFoo" async="true" return="false" />
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: