• vertx的学习总结6


    Beyond the event bus

    一、章节覆盖:

    如何在事件总线之上公开服务
    verticles和事件总线服务的异步测试

    动态代理

    MyService 接口

    1. package porxy.test;
    2. import io.vertx.codegen.annotations.ProxyGen;
    3. @ProxyGen
    4. public interface MyService {
    5. void hello(String name);
    6. }
    MyServiceImpl类
    1. package porxy.test;
    2. public class MyServiceImpl implements MyService {
    3. @Override
    4. public void hello(String name) {
    5. System.out.println("Hello, " + name + "!");
    6. }
    7. }

    Main类

    1. package porxy.test;
    2. import io.vertx.core.AbstractVerticle;
    3. import io.vertx.core.Vertx;
    4. import io.vertx.serviceproxy.ProxyHelper;
    5. public class MainVerticle extends AbstractVerticle {
    6. @Override
    7. public void start() {
    8. ProxyHelper.registerService(MyService.class, vertx, new MyServiceImpl(), "my-service");
    9. MyService service = ProxyHelper.createProxy(MyService.class, vertx, "my-service");
    10. service.hello("World");
    11. }
    12. public static void main(String[] args) {
    13. Vertx vertx1 = Vertx.vertx();
    14. vertx1.deployVerticle(new MainVerticle());
    15. }
    16. }

    看到这里,你们肯定一脸懵逼,如何在事件总线之上公开服务关动态代理什么事?其实是这样的,

    @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 注解修饰的方法,并验证其行为是否符合预期。可以在这里编写各种测试逻辑和断言  

    1. package Test;
    2. import io.vertx.core.Vertx;
    3. import io.vertx.junit5.VertxExtension;
    4. import io.vertx.junit5.VertxTestContext;
    5. import org.junit.jupiter.api.BeforeEach;
    6. import org.junit.jupiter.api.Test;
    7. import org.junit.jupiter.api.extension.ExtendWith;
    8. @ExtendWith(VertxExtension.class)
    9. public class VertxTest {
    10. private Vertx vertx;
    11. @BeforeEach
    12. void setup() {
    13. vertx = Vertx.vertx(); // 初始化 Vert.x 实例
    14. }
    15. @Test
    16. void testSomething(VertxTestContext testContext) throws InterruptedException {
    17. // 在这里编写你的测试逻辑
    18. vertx.setTimer(1000,event -> {
    19. System.out.println("hello");
    20. });
    21. Thread.sleep(2000);
    22. // 使用 testContext 来进行异步测试,并处理测试结果
    23. testContext.completeNow(); // 示例:完成测试
    24. }
    25. }

  • 相关阅读:
    【LeetCode: 151. 反转字符串中的单词 + 双指针】
    Java、Go、Rust大比拼,高并发时代谁能称雄?
    前端周刊第十七期
    Vue--Router--嵌套路由(children)的用法
    Java通过JNI技术调用C++动态链接库的helloword测试
    DFT简介(TODO)
    前端三剑客第一剑—Html基础标签讲解
    Android入门第34天-Android的Menu组件使用大全
    这是什么代码帮我看看
    SpringCache + SpringBoot + Mybatis + Redis实现缓存(案例解析)
  • 原文地址:https://blog.csdn.net/m0_63251896/article/details/133556073