异步通讯对于服务端响应时间较长的方法是必须的,能够有效地利用客户端的资源,在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异步调用三种方式的更多相关文章

  1. SpringBoot与Dubbo整合的三种方式

    1. 使用默认application.properties和注解的方式 导入dubbo-starter,在application.properties配置属性,使用@Service注解来暴露服务,使用 ...

  2. python 全栈开发,Day94(Promise,箭头函数,Django REST framework,生成json数据三种方式,serializers,Postman使用,外部python脚本调用django)

    昨日内容回顾 1. 内容回顾 1. VueX VueX分三部分 1. state 2. mutations 3. actions 存放数据 修改数据的唯一方式 异步操作 修改state中数据的步骤: ...

  3. 解决dubbo注册zookepper服务IP乱入问题的三种方式

    最近做一个项目引入了dubbo+zookepper的分布式服务治理框架.在应用的发布的时候出现一个怪问题.zookepper服务是起在开发服务器192.168.23.180上.本机起应用服务提供者注册 ...

  4. springboot与dubbo整合入门(三种方式)

    Springboot与Dubbo整合三种方式详解 整合环境: jdk:8.0 dubbo:2.6.2 springboot:2.1.5 项目结构: 1.搭建项目环境: (1)创建父项目与三个子项目,创 ...

  5. 【UE4 C++】Tick的三种方式、异步蓝图节点

    Tick的三种方式 包括 默认 Tick (Actor.Component.UMG) TimerManager 定时器 FTickableGameObject 可以写原生 Object 也可以继承UO ...

  6. [OpenSource]浅谈.Net和Java互相调用的三种方式

    在很多的大型系统开发中,开发工具往往不限制于同一种开发语言,而是会使用多种开发语言的混合型开发.目前Java和.Net都声称自己占85%的市场份额,不管谁对谁错,Java和.Net是目前应用开发的两个 ...

  7. 浅谈.Net和Java互相调用的三种方式

    在很多的大型系统开发中,开发工具往往不限制于同一种开发语言,而是会使用多种开发语言的混合型开发.目前Java和.Net都声称自己占85%的市场份 额,不管谁对谁错,Java和.Net是目前应用开发的两 ...

  8. Struts2方法调用的三种方式

    在Struts2中方法调用概括起来主要有三种形式 第一种方式:指定method属性 <action name="student" class="com.itmyho ...

  9. 调用awk的三种方式

    调用awk的三种方式 调用awk有三种方式,一种为Shell命令行方式,另外两种是将awk程序写入脚本文件,然后执行该脚本文件.三种方式的命令格式归纳如下: 一.在Shell命令行输入命令调用awk, ...

随机推荐

  1. POJ 1737 Connected Graph 题解(未完成)

    Connected Graph Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 3156   Accepted: 1533 D ...

  2. flume和kafka整合(转)

    原文链接:Kafka flume 整合 前提 前提是要先把flume和kafka独立的部分先搭建好. 下载插件包 下载flume-kafka-plus:https://github.com/beyon ...

  3. iOS:Xcode7以上版本安装镜像文件.dmg

    Xcode:7.0~7.3的镜像如下,点击直接下载安装 xcode7.0:https://developer.apple.com/services-account/download?path=/Dev ...

  4. Qt Creator怎样更改默认构建目录

    用过VS的朋友都知道,用VS编译工程时会将生成的可执行文件放在当前工程目录下,使每个工程独立地成为一个整体,管理起来颇为方便:而Qt Creator则不同,编译程序时会创建一个与当前工程目录同级的构建 ...

  5. Jmeter--google plugin插件监控被測系统资源方法

    一.插件准备 1.插件下载地址 http://jmeter-plugins.org/downloads/all/ 下面有两个版本号的.1.1.2和1.1.3.注意Jmeter版本号 1.1.2支持Jm ...

  6. .NET反编译之manager,base.AutoScaleMode修复

    使用反编译软件导出项目时,出现警告:设计器无法处理第X 行的代码:this.AutoScaleMode = AutoScaleMode.Font;方法"InitializeComponent ...

  7. 用php编写我的第一段代码:hello world

    一.php环境的搭建 在编写php前,先搭建php环境,我选择了一站式安装软件WampServer,WampServer的下载地址:http://www.wampserver.com/ WampSer ...

  8. java中循环控制结构

    1. break结束break所在循环 for(i……) { for(j……) { break;  //结束循环j } } 2.带标签的break. java中的标签只用在循环语句前面. outer: ...

  9. HTTP 响应头消息

    HTTP 响应头信息 HTTP请求头提供了关于请求,响应或者其他的发送实体的信息. 在本章节中我们将具体来介绍HTTP响应头信息. 应答头 说明 Allow 服务器支持哪些请求方法(如GET.POST ...

  10. es6- ArrayBuffer

    ArrayBuffer对象.TypedArray视图和DataView视图是 JavaScript 操作二进制数据的一个接口. 简单说: ArrayBuffer对象代表原始的二进制数据, TypedA ...