天天看点

dubbo高级应用异步调用(可以实现类似循环屏障)

dubbo高级应用异步调用(可以实现类似循环屏障)

1,消费端配置好异步调用声明

2,调用一个异步方法马上getfuthure,此时wait,这个有返回后再向下调用另一个异步方法,这样即可都完成才结束大的任务

异步就是在于不等待请求发出就向下,直接用一个新建的future等,有返回自动会写到future,但是要自己拿,用future拿的时候没拿到就会等了(可设置等待时间),这样一来利用上了主线程执行任务的时间给子线程去返回

 // 如果foo需要5秒返回,bar需要6秒返回,实际只需等6秒,即可获取到foo和bar,进行接下来的处理。

异步调用

(+) (#)

dubbo高级应用异步调用(可以实现类似循环屏障)
基于NIO的非阻塞实现并行调用,客户端不需要启动多线程即可完成并行调用多个远程服务,相对多线程开销较小。
dubbo高级应用异步调用(可以实现类似循环屏障)
2.0.6及其以上版本支持
dubbo高级应用异步调用(可以实现类似循环屏障)

配置声明:

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

>

调用代码:

fooService.findFoo(fooId);

// 此调用会立即返回null

Future<Foo> fooFuture = RpcContext.getContext().getFuture();

// 拿到调用的Future引用,当结果返回后,会被通知和设置到此Future。

barService.findBar(barId);

// 此调用会立即返回null

Future<Bar> barFuture = RpcContext.getContext().getFuture();

// 拿到调用的Future引用,当结果返回后,会被通知和设置到此Future。

// 此时findFoo和findBar的请求同时在执行,客户端不需要启动多线程来支持并行,而是借助NIO的非阻塞完成。

Foo foo = fooFuture.get();

// 如果foo已返回,直接拿到返回值,否则线程wait住,等待foo返回后,线程会被notify唤醒。

Bar bar = barFuture.get();

// 同理等待bar返回。

// 如果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"

/>

继续阅读