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(); // 示例:完成测试
- }
- }