dubbo异步调用三种方式

Posted 甜菜波波

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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>

以上是关于dubbo异步调用三种方式的主要内容,如果未能解决你的问题,请参考以下文章

手写dubbo-5rpc调用异步转同步

dubbo同步调用异步调用和是否返回结果源码分析和实例

java三种调用方式(同步调用/回调/异步调用)

Dubbo消费端同步调用异步调用(基于Dubbo3)

Dubbo异步调用源码解读和Bug分析

dubbo异步调用的坑