vertx的学习总结6之动态代理类和测试
Beyond the event bus
一、章节覆盖:
如何在事件总线之上公开服务
verticles和事件总线服务的异步测试
动态代理:
MyService 接口
package porxy.test;
import io.vertx.codegen.annotations.ProxyGen;
@ProxyGen
public interface MyService {
void hello(String name);
}
MyServiceImpl类
package porxy.test;
public class MyServiceImpl implements MyService {
@Override
public void hello(String name) {
System.out.println("Hello, " + name + "!");
}
}
Main类
package porxy.test;
import io.vertx.core.AbstractVerticle;
import io.vertx.core.Vertx;
import io.vertx.serviceproxy.ProxyHelper;
public class MainVerticle extends AbstractVerticle {
@Override
public void start() {
ProxyHelper.registerService(MyService.class, vertx, new MyServiceImpl(), "my-service");
MyService service = ProxyHelper.createProxy(MyService.class, vertx, "my-service");
service.hello("World");
}
public static void main(String[] args) {
Vertx vertx1 = Vertx.vertx();
vertx1.deployVerticle(new MainVerticle());
}
}
看到这里,你们肯定一脸懵逼,如何在事件总线之上公开服务关动态代理什么事?其实是这样的,
@ProxyGen是Vert.x框架中用于生成代理类的工具。它可以根据接口定义生成对应的代理类,代理类可以用于在不同的Vert.x组件之间进行通信。(就是eventbus)
这些生成的代理类主要用于Vert.x的分布式事件总线。分布式事件总线是一种机制,它允许在Vert.x集群中的不同节点之间进行消息传递和事件发布/订阅。使用@ProxyGen生成的代理类可以将接口方法调用转化为事件总线消息发送,并且将返回结果反馈给调用方。
具体来说,当使用@ProxyGen注解修饰一个接口时,会生成一个代理类,该代理类实现了被注解的接口,并且可以通过事件总线进行远程调用。生成的代理类内部会将接口方法调用封装为消息对象,然后通过事件总线将消息发送给服务提供方,服务提供方收到消息后会执行相应的逻辑,并将结果返回给调用方。
生成的代理类使得远程通信变得更加简单和透明,开发者无需关心底层的通信细节,只需要像调用本地方法一样调用生成的代理类即可。

二、异步测试
1. 引入依赖

各个注解的解释
@ExtendWith(VertxExtension.class) 注解告诉 JUnit 使用 VertxExtension 来运行测试。VertxExtension 内部会创建一个 Vert.x 实例,并在测试之前和之后进行启动和关闭操作。它还提供了一些用于执行异步操作和处理 Vert.x 上下文的工具方法。
@BeforeEach 注解表示在每个测试方法之前运行该方法。在测试方法运行之前,会先执行被 @BeforeEach 注解修饰的方法。这里可以进行一些准备工作,例如创建测试数据、初始化对象等。
@Test 注解表示该方法是一个测试方法。JUnit 会执行被 @Test 注解修饰的方法,并验证其行为是否符合预期。可以在这里编写各种测试逻辑和断言
package Test;
import io.vertx.core.Vertx;
import io.vertx.junit5.VertxExtension;
import io.vertx.junit5.VertxTestContext;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
@ExtendWith(VertxExtension.class)
public class VertxTest {
private Vertx vertx;
@BeforeEach
void setup() {
vertx = Vertx.vertx(); // 初始化 Vert.x 实例
}
@Test
void testSomething(VertxTestContext testContext) throws InterruptedException {
// 在这里编写你的测试逻辑
vertx.setTimer(1000,event -> {
System.out.println("hello");
});
Thread.sleep(2000);
// 使用 testContext 来进行异步测试,并处理测试结果
testContext.completeNow(); // 示例:完成测试
}
}
vertx的学习总结6之动态代理类和测试的更多相关文章
- Spring学习笔记之aop动态代理(3)
Spring学习笔记之aop动态代理(3) 1.0 静态代理模式的缺点: 1.在该系统中有多少的dao就的写多少的proxy,麻烦 2.如果目标接口有方法的改动,则proxy也需要改动. Person ...
- Java反射学习总结四(动态代理使用实例和内部原理解析)
通过上一篇文章介绍的静态代理Java反射学习总结三(静态代理)中,大家可以发现在静态代理中每一个代理类只能为一个接口服务,这样一来必然会产生过多的代理,而且对于每个实例,如果需要添加不同代理就要去添加 ...
- 学习CGLIB与JDK动态代理的区别
动态代理 代理模式是Java中常见的一种模式.代理又分为静态代理和动态代理.静态代理就是显式指定的代理,静态代理的优点是由程序员自行指定代理类并进行编译和运行,缺点是一个代理类只能对一个接口的实现类进 ...
- Hibernate学习--hibernate延迟加载原理-动态代理(阿里电面)
在正式说hibernate延迟加载时,先说说一个比较奇怪的现象吧:hibernate中,在many-to-one时,如果我们设置了延迟加载,会发现我们在eclipse的调试框中查看one对应对象时,它 ...
- 秒懂C#通过Emit动态生成代码 C#使用Emit构造拦截器动态代理类
秒懂C#通过Emit动态生成代码 首先需要声明一个程序集名称, 1 // specify a new assembly name 2 var assemblyName = new Assembly ...
- WebServeice 动态代理类
1, webservice是什么? 是一个平台独立的,低耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述.发布.发现.协调和配置这些应用程序 ...
- C#使用Emit构造拦截器动态代理类
在AOP编程概念介绍中,常见的示例为拦截对象,并在对象的某方法执行前和执行后分别记录日志. 而最常用的拦截方式是使用动态代理类,用其封装一个日志拦截器,当方法被执行时进行日志记录. 日志拦截器类 1 ...
- CGLIB 和 JDK生成动态代理类的区别(转)
文章转自http://luyuanliang.iteye.com/blog/1137292 AOP 使用的设计模式就是代理模式,是对IOC设计的补充.为了扩展性,往往会加上反射,动态生成字节码,生成代 ...
- spring AbstractBeanDefinition创建bean类型是动态代理类的方式
1.接口 Class<?> resourceClass 2.获取builder BeanDefinitionBuilder builder = BeanDefinitionBuilder. ...
- java代理模式及动态代理类
1. 代理模式 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用 ...
随机推荐
- [ABC284F] ABCBAC
2023-01-09 题目 题目传送门 翻译 翻译 难度&重要性(1~10):2.5 题目来源 AtCoder 题目算法 Z函数,KMP,字符串Hash 解题思路 对于一个 \(f_S\),我 ...
- Programming abstractions in C阅读笔记:p130-p131
<Programming Abstractions In C>学习第52天,p130-p131,总结如下: 一.技术总结 1. pig latin game 通过pig latin gam ...
- 每天一道面试题:Spring的Bean生命周期
Spring的Bean生命周期包括以下步骤: 1.实例化(Instantiation):当Spring容器接收到创建Bean的请求时,它会先实例化Bean对象.这个过程可以通过构造函数.工厂方法或者反 ...
- Paddle图神经网络训练-PGLBox代码阅读笔记
图存储部分 paddle/fluid/framework/fleet/heter_ps graph_gpu_wrapper.h GPU图主入口 graph_gpu_ps_table.h GPU图的主要 ...
- HTML一键打包IPA(苹果IOS应用)工具 网站打包 APP
工具简介 HTML一键打包IPA(苹果应用)工具可以把本地HTML项目或者网站打包为一个苹果应用IPA文件,无需编写任何代码,支持在苹果设备上安装运行. 该软件已经被GDB苹果网页一键打包工具取代,详 ...
- 文心一言 VS 讯飞星火 VS chatgpt (92)-- 算法导论8.3 5题
五.用go语言,在本节给出的第一个卡片排序算法中,为排序 d 位十进制数,在最坏情况下需要多少轮排序?在最坏情况下,操作员需要记录多少堆卡片? 文心一言: 你提到的第一个卡片排序算法可能是指的基数排序 ...
- Docker Compose V2 安装常用数据库MySQL+Mongo
前言 书接上篇:Docker V24 及 Docker Compose V2 的安装及使用 本篇操作都在 centos8 虚拟机 devops01 中进行,并都归属网络:devopsnetwork 主 ...
- [CISCN 2019华东南]Web11
看到下面connection 里面的内容有一点像抓包出来的 就抓包试试 似乎感觉也没有什么用 看到这个东西,那么就想到改IP 添加X-Forwarded-For:127.0.0.1 发现这个IP随着我 ...
- 【第一章 web入门】afr_3——模板注入与proc文件夹
[第一章 web入门]afr_3--模板注入与proc文件夹 题目来源n1book,buu上的环境 看题 url中提供了name参数,类似在路径中进行了文件名查询然后展示: 随便输入一个数字: 说明肯 ...
- Unity - UIWidgets 3. 页面跳转
Flutter的Route概念, 移动开发常指Page, 在android中指activity, ios中指viewcontroller, UGUI中常称为Panel\Form\View? 大概说的就 ...