dubbo異步調用三種方式


異步通訊對於服務端響應時間較長的方法是必須的,能夠有效地利用客戶端的資源,在dubbo中,消費端<dubbp:method>通過 async="true"標識。

<dubbo:reference id="xxx" ....>

    <dubbo:method name="method1" async="true" />

</dubbo:reference>

具體有三種方式:

1、NIO future主動獲取結果,返回結果放在RpcContext中

     需要注意的是,由於RpcContext是單例模式,所以每次調用完后,需要保存一個Future實例;如:

      fooService.findFoo(fooId);
      Future<Foo> fooFuture = RpcContext.getContext().getFuture();
      barService.findBar(barId);
      Future<Bar> barFuture = RpcContext.getContext().getFuture();
      barService.findBar(barId);
      Bar bar = barFuture.get();

2、通過回調(Callback)參數

      Callback並不是dubbo內部類或接口,而是由應用自定義的、實現了Serializable的接口;

      分兩步:1)服務提供者需在方法中聲明Callback參數,其后在Service實現中顯示地調用Callback的方法;

      <dubbo:service ..>
         <dubbo:method name="method1">
            <dubbo:argument index="1" callback="true" />  #標識第二個參數是callback類型
         </dubbo:method>
      </dubbo:service>

      2)Callback接口的實現類在消費端,當方法發生調用時,消費端會自動export一個Callback服務,在Rpc調用完成后,不能立即結束線程。

      <dubbo:reference ...>
         <dubbo:method name="method1" async="true">
      </dubbo:reference>

3、事件通知(推薦)

     這種方式更簡單,對服務提供方來講是透明的,包括配置和代碼上,均無需做任何改動。

     消費端定義一個“通知者”的Spring Bean,指定方法的onreturn和onthrow事件action就可以。
      <bean id="notify" class="com.alibaba.dubbo.callback.implicit.NofifyImpl" />
      <dubbo:reference >
<dubbo:method name="method1" async="true" onreturn="notify.onreturn" onthrow="notify.onthrow" />
      </dubbo:reference>


免責聲明!

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



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