相关资料

官方文档

项目结构

代码示例

  • [EchoTestApp]
@RestController
@SpringBootApplication
@ImportResource("classpath:/consumer.xml")
public class EchoTestApp {
@Autowired
private ClientService clientService; @GetMapping("/hi/{name}")
public String hello(@PathVariable(name = "name") String name) throws InterruptedException, ExecutionException, TimeoutException {
return clientService.echo(name); } public static void main(String[] args) {
System.getProperties().put("server.port", 7070);
SpringApplication.run(EchoTestApp.class, args);
} @Configuration
@EnableDubbo(scanBasePackages = "consumer")
@PropertySource("classpath:/dubbo-consumer.properties")
static public class ConsumerConfiguration { }
}

和之前的区别在于 @ImportResource("classpath:/consumer.xml") 引入dubbo的xml配置

至于为什么用xml呢?因为没有找到 dubbo 事件通知 api 的参考示例

  • [consumer.xml]
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd"> <dubbo:application name="annotation-consumer"/>
<dubbo:registry address="zookeeper://127.0.0.1:2181"/> <dubbo:reference id="echoService" check="false" interface="com.xh.dubbo.learn.lesson2.api.IEchoService">
<dubbo:method name="echo" async="true" onreturn="notify.onReturn" onthrow="notify.onThrow"/>
</dubbo:reference> <bean class="com.xh.dubbo.learn.lesson2.service.ClientService" id="clientService">
<property name="echoService" ref="echoService"></property>
</bean>
</beans>
  • [dubbo-consumer.properties] 注释掉里面的所有配置,应为不能和上面的重复

  • [ClientService] 注释掉里面的重复配置

package com.xh.dubbo.learn.lesson2.service;

import com.xh.dubbo.learn.lesson2.api.IEchoService;
import org.apache.dubbo.rpc.RpcContext; import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException; /*@Service*/
public class ClientService {
/**
* xml和注解不能同时定义
*/
/* @Reference*/
private IEchoService echoService; public String echo(String msg) throws ExecutionException, InterruptedException, TimeoutException { String result = echoService.echo(msg);// 这里的返回值为空,请不要使用
Future<String> future = RpcContext.getContext().getFuture();
// 业务线程可以开始做其他事情
System.out.println("start do other thing...");
//Thread.sleep(100);
System.out.println("print result:" + result);
System.out.println("other thing is done"); result = future.get(3000, TimeUnit.MILLISECONDS); // 阻塞需要获取异步结果时,也可以使用 get(timeout, unit) 设置超时时间
return result == null ? "error result" : result;
} public IEchoService getEchoService() {
return echoService;
} public void setEchoService(IEchoService echoService) {
this.echoService = echoService;
}
}
  • [INotify]
public interface INotify {
void onReturn(String returnStr, String arg); void onThrow(Throwable ex, String arg);
}
  • [NotifyImpl]
@Component("notify")
public class NotifyImpl implements INotify {
public void onReturn(String returnStr, String arg) {
System.out.println("do something onReturn");
System.out.println(returnStr);
System.out.println(arg); } public void onThrow(Throwable ex, String arg) {
System.out.println("do something onThrow");
System.out.println(ex.getMessage());
System.out.println(arg); }
}

需要注意的是以上方法的参数的类型和个数需要和配置文件中的比如 notify.onReturn 一致,只是前面多了返回值或者异常

输出

控制台

start do other thing...

print result:null

other thing is done

do something onReturn

echo: 哈哈哈

哈哈哈

浏览器

dubbo学习笔记四(异步调用)的更多相关文章

  1. MongoDB 学习笔记四 C#调用MongoDB

    驱动 下载 https://github.com/mongodb/mongo-csharp-driver/downloads 项目地址: https://github.com/mongodb/mong ...

  2. go微服务框架kratos学习笔记四(kratos warden-quickstart warden-direct方式client调用)

    目录 go微服务框架kratos学习笔记四(kratos warden-quickstart warden-direct方式client调用) warden direct demo-server gr ...

  3. java之jvm学习笔记四(安全管理器)

    java之jvm学习笔记四(安全管理器) 前面已经简述了java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一个重要组成部分安全管理器. 安全管理器 ...

  4. Typescript 学习笔记四:回忆ES5 中的类

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  5. muduo网络库学习笔记(四) 通过eventfd实现的事件通知机制

    目录 muduo网络库学习笔记(四) 通过eventfd实现的事件通知机制 eventfd的使用 eventfd系统函数 使用示例 EventLoop对eventfd的封装 工作时序 runInLoo ...

  6. python3.4学习笔记(四) 3.x和2.x的区别,持续更新

    python3.4学习笔记(四) 3.x和2.x的区别 在2.x中:print html,3.x中必须改成:print(html) import urllib2ImportError: No modu ...

  7. 零拷贝详解 Java NIO学习笔记四(零拷贝详解)

    转 https://blog.csdn.net/u013096088/article/details/79122671 Java NIO学习笔记四(零拷贝详解) 2018年01月21日 20:20:5 ...

  8. kvm虚拟化学习笔记(四)之kvm虚拟机日常管理与配置

    KVM虚拟化学习笔记系列文章列表----------------------------------------kvm虚拟化学习笔记(一)之kvm虚拟化环境安装http://koumm.blog.51 ...

  9. ASP.NET MVC 学习笔记-7.自定义配置信息 ASP.NET MVC 学习笔记-6.异步控制器 ASP.NET MVC 学习笔记-5.Controller与View的数据传递 ASP.NET MVC 学习笔记-4.ASP.NET MVC中Ajax的应用 ASP.NET MVC 学习笔记-3.面向对象设计原则

    ASP.NET MVC 学习笔记-7.自定义配置信息   ASP.NET程序中的web.config文件中,在appSettings这个配置节中能够保存一些配置,比如, 1 <appSettin ...

随机推荐

  1. 哨兵模式java实例

    /** * 测试Redis哨兵模式 * @author liu */ public class TestSentinels { @SuppressWarnings("resource&quo ...

  2. 打开App显示文件已损坏,打不开,您应该将它移到废纸篓,怎么办?

    1. 首先确保系统安全设置已经改为任何来源 sudo spctl --master-disable 2. 打开任何来源后,到应用程序目录中尝试运行软件,如果仍提示损坏,请在应用图标上,鼠标右键,在弹出 ...

  3. JAVA和Tomcat运维整理

    安装JAVA和Tomcatapache-tomcat-8.5.37.tar.gz  jdk-8u191-linux-x64.rpm [root@localhost ~]# ll /usr/java/t ...

  4. Jmeter建立一个扩展LDAP测试计划

    Jmeter建立一个扩展LDAP测试计划 添加用户 第一步你想做的每一个JMeter测试计划是添加一个线程组元素. 线程组告诉JMeter的用户数量你想模拟,用户应该发送的次数 请求,他们应该发送的请 ...

  5. 《Improving Deep Neural Networks:Hyperparameter tuning, Regularization and Optimization》课堂笔记

    Lesson 2 Improving Deep Neural Networks:Hyperparameter tuning, Regularization and Optimization 这篇文章其 ...

  6. Angular引入第三方库

    原文已经写的很好了.原文链接: https://blog.csdn.net/yuzhiqiang_1993/article/details/71215232 加上2点给自己用,引入bootstrap样 ...

  7. Java split(".") 和 split("\\.")

    Java split(".") 和 split("\\.") 问题描述 使用 . 分解 IP 的各个段,并打印,如:192.168.10.123,分解为 192 ...

  8. 【D3D12学习手记】The Swap Chain and Page Flipping

    为了避免动画中的闪烁,最好将整个动画帧绘制到称为后台缓冲区的屏幕外纹理(off-screen texture)中.一旦整个场景被绘制到给定动画帧的后缓冲区,它就作为一个完整的帧呈现给屏幕;以这种方式, ...

  9. Linux中如何批量删除目录下文件后缀

    1. rename rename分为perl版本和C版本,以下截图是C版本效果: perl版本:rename 's/.bak//' *.bak 2. for循环+awk 3. for循环+cut 4. ...

  10. Android开发 互相调用模式之导出Jar包、扩展MainActivity、Java主导

    首先讲导出Jar包,在以前都是用这种方法,但是现在官方不推荐使用此方法,官方推荐导出Aar包 (1)首先创建一个Android空工程 注意:这里选择API 16,因为Unity支持的最低是API 16 ...