真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

怎么使用Dubbo異步處理

這篇文章主要介紹“怎么使用Dubbo異步處理”,在日常操作中,相信很多人在怎么使用Dubbo異步處理問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”怎么使用Dubbo異步處理”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

10年的河西網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。全網(wǎng)整合營(yíng)銷(xiāo)推廣的優(yōu)勢(shì)是能夠根據(jù)用戶(hù)設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整河西建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)從事“河西網(wǎng)站設(shè)計(jì)”,“河西網(wǎng)站推廣”以來(lái),每個(gè)客戶(hù)項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。

異步調(diào)用

我們平常大部分都是使用 Dubbo 的同步調(diào)用,即調(diào)用 Dubbo 請(qǐng)求之后,調(diào)用線程將會(huì)阻塞,直到服務(wù)提供者返回結(jié)果。

那相反,Dubbo 異步調(diào)用就不會(huì)阻塞調(diào)用線程,那么在服務(wù)提供者返回結(jié)果這段時(shí)間,我們就可以執(zhí)行其他業(yè)務(wù)邏輯。

下面我們從代碼示例,來(lái)學(xué)習(xí)一下如何使用 Dubbo 異步調(diào)用。

PS:下面例子 Dubbo 版本為 2.7。

第一種方式

Dubbo 異步調(diào)用是針對(duì)方法級(jí)別,所以我們需要對(duì)引用接口中指定方法做一些專(zhuān)門(mén)的配置。

異步調(diào)用配置其實(shí)與普通 xml服務(wù)引用配置類(lèi)似,只不過(guò)我們還需要增加一個(gè) dubbo:method將指定方法配置成異步調(diào)用。

示例 xml 配置如下:

        

服務(wù)引用配置完成之后,此時(shí)如果直接調(diào)用這個(gè)方法,將會(huì)立即返回 null,內(nèi)部將會(huì)異步執(zhí)行服務(wù)端調(diào)用邏輯。

// 此調(diào)用會(huì)立即返回null String world = asyncService.sayHello("world");

// 畫(huà)個(gè)時(shí)序圖

如果我們需要獲取服務(wù)提供者返回的結(jié)果,那么此時(shí)需要借助 RpcContext。這個(gè)類(lèi)是 Dubbo 中專(zhuān)門(mén)用于保存 「RPC」  調(diào)用過(guò)程中一些關(guān)鍵信息。

因此我們可以借助這個(gè)類(lèi)可以獲取到 「RPC」 很多信息,這次我們主要使用下面的方法獲取 CompletableFuture。

RpcContext.getContext().getCompletableFuture()

CompletableFuture 是 JDK1.8 之后提供的異步任務(wù)增強(qiáng)類(lèi),我們可以直接調(diào)用其 get 方法直接獲取返回結(jié)果。

// 此調(diào)用會(huì)立即返回null String world = asyncService.sayHello("world"); // 拿到調(diào)用的Future引用,當(dāng)結(jié)果返回后,會(huì)被通知和設(shè)置到此Future CompletableFuture helloFuture = RpcContext.getContext().getCompletableFuture(); helloFuture.get();

這里需要注意一點(diǎn)。調(diào)用get 方法之后,線程就會(huì)被阻塞,「直到服務(wù)端返回結(jié)果或者服務(wù)調(diào)用超時(shí)」。

另外如果不想線程被阻塞,我們可以使用 whenComplete,添加回調(diào)方法,然后異步處理返回結(jié)果。

// 此調(diào)用會(huì)立即返回null String world = asyncService.sayHello("world"); // 拿到調(diào)用的Future引用,當(dāng)結(jié)果返回后,會(huì)被通知和設(shè)置到此Future CompletableFuture helloFuture = RpcContext.getContext().getCompletableFuture(); // 為Future添加回調(diào) helloFuture.whenComplete((retValue, exception) -> {     if (exception == null) {         System.out.println("return value: " + retValue);     } else {         exception.printStackTrace();     } });

從上面的例子我們可以看到, Dubbo 消費(fèi)端異步調(diào)用借助了JDK 提供的  CompletableFuture,這個(gè)類(lèi)非常強(qiáng)大,提供的方法也非常多。

小黑哥之前寫(xiě)過(guò)一篇文章,比較完整的介紹了 CompletableFuture的用法,感興趣可以深入學(xué)習(xí)一下。

// TODO 文章

上面的方式我們使用 xml引用服務(wù),不過(guò)現(xiàn)在很多同學(xué)應(yīng)該直接使用 Dubbo 注解引用服務(wù)。

如果想直接使用注解方式,其實(shí)也非常簡(jiǎn)單,只要使用 @Method注解即可。

配置方法如下:

@Reference(interfaceClass = AsyncService.class,         timeout = 1000,         methods = {@Method(name = "sayHello", async = true)}) private AsyncService asyncService;

第二種方式

第一種方式我們還需要額外修改 Dubbo 相關(guān)配置,相對(duì)來(lái)說(shuō)比較繁瑣。那第二種方式就不需要做額外配置了,它只要使用  RpcContext#asyncCall就可以直接完成異步調(diào)用。

示例代碼如下:

// 使用  asyncCall 異步調(diào)用 CompletableFuture f = RpcContext.getContext().asyncCall(() -> asyncService.sayHello("async call request")); // get 將會(huì)一直阻塞到服務(wù)端返回,或者直到服務(wù)調(diào)用超時(shí) System.out.println("async call returned: " + f.get());  // 異步調(diào)用,不關(guān)心服務(wù)端返回 RpcContext.getContext().asyncCall(() -> {     asyncService.sayHello("one way call request1"); });

這種方式返回依然是 CompletableFuture對(duì)象,操作方式就如同第一種方式。

第三種方式

終于到了最后一種方式了,這種方式與上面兩種方式都不太一樣,其完全不需要借助RpcContext就可以完成,開(kāi)發(fā)流程與普通 Dubbo 服務(wù)一樣。

首先需要服務(wù)提供者事先定義 CompletableFuture 簽名的服務(wù):

public interface AsyncService {     CompletableFuture sayHello(String name); }

「注意接口的返回類(lèi)型是 CompletableFuture?!?/string>

服務(wù)端接口實(shí)現(xiàn)邏輯如下:

public class AsyncServiceImpl implements AsyncService {     private static Logger logger = LoggerFactory.getLogger(AsyncServiceImpl.class);      @Override     public CompletableFuture sayHello(String name) {         return CompletableFuture.supplyAsync(() -> {             try {                 Thread.sleep(10000);             } catch (InterruptedException e) {                 e.printStackTrace();             }             return "async response from provider.";         });     }  }

服務(wù)端需要使用 CompletableFuture 完成業(yè)務(wù)邏輯。

消費(fèi)端這時(shí)就不需要借助了 RpcContext,可以直接調(diào)用服務(wù)提供者。

// 調(diào)用直接返回CompletableFuture CompletableFuture 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.")

這種方式對(duì)于調(diào)用者來(lái)就比較方便,無(wú)需引入其他對(duì)象,可以像使用同步的方式使用異步調(diào)用。

其他參數(shù)

上面介紹了三種的 Dubbo 異步調(diào)用的使用方式,下面主要介紹一下異步調(diào)用涉及其他參數(shù)。

sent

我們可以在 dubbo:method 設(shè)置:

也可以在注解中設(shè)置:

@Reference(interfaceClass = XXX.class,         version = AnnotationConstants.VERSION,         timeout = 1000,         methods = {@Method(name = "greeting", timeout = 3000, retries = 1, sent = false)})

默認(rèn)情況下sent=false, Dubbo 將會(huì)把消息放入 IO 隊(duì)列,然后立刻返回。那這時(shí)如果宕機(jī),消息就有可能沒(méi)有發(fā)送給服務(wù)端。

那如果我們將其設(shè)置成 sent=true,Dubbo 將會(huì)等待消息發(fā)送發(fā)出才會(huì)返回,否則將會(huì)拋出異常。

return

Dubbo 異步調(diào)用默認(rèn)將會(huì)創(chuàng)建 Future 對(duì)象,然后設(shè)置到 RpcContext 中。那我們?nèi)绻魂P(guān)心返回值,只想單純的異步執(zhí)行,那我們可以配置  return="false",以此減少 Future 對(duì)象的創(chuàng)建和管理成本。

到此,關(guān)于“怎么使用Dubbo異步處理”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!


標(biāo)題名稱(chēng):怎么使用Dubbo異步處理
網(wǎng)站路徑:http://weahome.cn/article/gchpji.html

其他資訊

在線咨詢(xún)

微信咨詢(xún)

電話咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部