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. 引入依赖

各个注解的解释

  1. @ExtendWith(VertxExtension.class) 注解告诉 JUnit 使用 VertxExtension 来运行测试。VertxExtension 内部会创建一个 Vert.x 实例,并在测试之前和之后进行启动和关闭操作。它还提供了一些用于执行异步操作和处理 Vert.x 上下文的工具方法。

  2. @BeforeEach 注解表示在每个测试方法之前运行该方法。在测试方法运行之前,会先执行被 @BeforeEach 注解修饰的方法。这里可以进行一些准备工作,例如创建测试数据、初始化对象等。

  3. @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之动态代理类和测试的更多相关文章

  1. Spring学习笔记之aop动态代理(3)

    Spring学习笔记之aop动态代理(3) 1.0 静态代理模式的缺点: 1.在该系统中有多少的dao就的写多少的proxy,麻烦 2.如果目标接口有方法的改动,则proxy也需要改动. Person ...

  2. Java反射学习总结四(动态代理使用实例和内部原理解析)

    通过上一篇文章介绍的静态代理Java反射学习总结三(静态代理)中,大家可以发现在静态代理中每一个代理类只能为一个接口服务,这样一来必然会产生过多的代理,而且对于每个实例,如果需要添加不同代理就要去添加 ...

  3. 学习CGLIB与JDK动态代理的区别

    动态代理 代理模式是Java中常见的一种模式.代理又分为静态代理和动态代理.静态代理就是显式指定的代理,静态代理的优点是由程序员自行指定代理类并进行编译和运行,缺点是一个代理类只能对一个接口的实现类进 ...

  4. Hibernate学习--hibernate延迟加载原理-动态代理(阿里电面)

    在正式说hibernate延迟加载时,先说说一个比较奇怪的现象吧:hibernate中,在many-to-one时,如果我们设置了延迟加载,会发现我们在eclipse的调试框中查看one对应对象时,它 ...

  5. 秒懂C#通过Emit动态生成代码 C#使用Emit构造拦截器动态代理类

    秒懂C#通过Emit动态生成代码   首先需要声明一个程序集名称, 1 // specify a new assembly name 2 var assemblyName = new Assembly ...

  6. WebServeice 动态代理类

    1, webservice是什么? 是一个平台独立的,低耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述.发布.发现.协调和配置这些应用程序 ...

  7. C#使用Emit构造拦截器动态代理类

    在AOP编程概念介绍中,常见的示例为拦截对象,并在对象的某方法执行前和执行后分别记录日志. 而最常用的拦截方式是使用动态代理类,用其封装一个日志拦截器,当方法被执行时进行日志记录. 日志拦截器类 1 ...

  8. CGLIB 和 JDK生成动态代理类的区别(转)

    文章转自http://luyuanliang.iteye.com/blog/1137292 AOP 使用的设计模式就是代理模式,是对IOC设计的补充.为了扩展性,往往会加上反射,动态生成字节码,生成代 ...

  9. spring AbstractBeanDefinition创建bean类型是动态代理类的方式

    1.接口 Class<?> resourceClass 2.获取builder BeanDefinitionBuilder builder = BeanDefinitionBuilder. ...

  10. java代理模式及动态代理类

     1.      代理模式 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用 ...

随机推荐

  1. LeetCode 周赛上分之旅 #42 当 LeetCode 考树上倍增,出题的趋势在变化吗

    ️ 本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 和 BaguTree Pro 知识星球提问. 学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越 ...

  2. WPF-利用装饰器实现控件的自由拖动

    在项目中经常会遇到类似如下要求的需求,创建允许自由拖动的控件,这样的需求可以使用WPF的装饰器Adorner来实现. 一.什么是装饰器? 装饰器是一种特殊类型的FrameworkElement,装饰器 ...

  3. 完全可复制、经过验证的 Go 工具链

    原文在这里. 由 Russ Cox 发布于 2023年8月28日 开源软件的一个关键优势是任何人都可以阅读源代码并检查其功能.然而,大多数软件,甚至是开源软件,都以编译后的二进制形式下载,这种形式更难 ...

  4. k8s 入门到实战--部署应用到 k8s

    背景 最近这这段时间更新了一些 k8s 相关的博客和视频,也收到了一些反馈:大概分为这几类: 公司已经经历过服务化改造了,但还未接触过云原生. 公司部分应用进行了云原生改造,但大部分工作是由基础架构和 ...

  5. 面霸的自我修养:ThreadLocal专题

    王有志,一个分享硬核Java技术的互金摸鱼侠 加入Java人的提桶跑路群:共同富裕的Java人 今天是<面霸的自我修养>第5篇文章,我们一起来看看面试中会问到哪些关于ThreadLocal ...

  6. 微信Native支付(扫码支付)商户配置

    0.需要从商户平台获取/设置的配置 公众号appId 商户号 APIv3密钥 证书序列号 证书密钥 1.扫码登录商户平台 网址:https://pay.weixin.qq.com/ 2.确认已开通Na ...

  7. Record -「NOIP-S 2020」赛后总结

    不是特别想说伤心的事情. T1 一遍过完所有大样例,此时只过去了十几二十分钟,不过之前花了半个小时通读了整个 PDF 所以此时大概过了 1h. T2 大概花了十几分钟胡出了一个反着枚举就是正解的 n^ ...

  8. “&”控制命令的运行方式

    在Unix.Linux和类Unix系统中,& 符号有特定的意义,用于控制命令的运行方式.具体来说,& 在命令末尾使用时表示将该命令放入后台运行. 前台运行: 如果你在终端输入一个命令, ...

  9. Qt信号槽与事件循环学习笔记

    事件与事件循环 信号槽机制 事件与事件循环 在Qt中,事件(event)被封装为QEvent类/子类对象,用来表示应用内部或外部发生的各种事情.事件可以被任何QObject子类的对象接收并处理. 根据 ...

  10. 【BUU刷题日记】--第二周

    [BUU刷题日记]--第二周 一.[WUSTCTF2020]朴实无华 1 目录爆破 使用dirsearch扫描发现没有结果,因为如果dirsearch请求过快则会导致超出服务器最大请求,扫描不出本来可 ...