当前位置: 首页 > 知识库问答 >
问题:

Vertx事件总线无法将消息发送到不同的verticle

张岳
2023-03-14

我对Vertx很陌生,但我对测试它与Spring的集成很感兴趣。我使用Spring Boot来提升项目,并部署了两个顶点。我希望他们使用事件总线相互通信,但失败了。这就是我所做的:

>

  • 在主应用程序中:

    @SpringBootApplication公共类MySpringVertxApplication{@Autowired MyRestAPIServer MyRestAPIServer;@Autowired MyRestAPIVerticle MyRestAPIVerticle;

    public static void main(String[] args) {
    SpringApplication.run(MySpringVertxApplication.class, args);
    }
    
    @PostConstruct
    public void deployVerticles(){
    System.out.println("deploying...");
    
    Vertx.vertx().deployVerticle(MyRestAPIVerticle);
    Vertx.vertx().deployVerticle(myRestAPIServer);
    }
    

    }

    在apirticle中:

    @Component公共类MyRestAPIVerette扩展抽象版本{

    public static final String ALL_ACCOUNT_LISTING = "com.example.ALL_ACCOUNT_LISTING";
    
    @Autowired
    AccountService accountService;
    
    EventBus eventBus;
    
    @Override
    public void start() throws Exception {
    super.start();
    
    eventBus = vertx.eventBus();
    MessageConsumer<String> consumer = eventBus.consumer(MyRestAPIVerticle.ALL_ACCOUNT_LISTING);
    consumer.handler(message -> {
        System.out.println("I have received a message: " + message.body());
        message.reply("Pretty Good");
      });
    consumer.completionHandler(res -> {
        if (res.succeeded()) {
          System.out.println("The handler registration has reached all nodes");
        } else {
          System.out.println("Registration failed!");
        }
      });
    }
    

    }

    最后服务器版本:

    @服务公共类MyRestAPIServer扩展了AbstractVerticle{

    HttpServer server;
    HttpServerResponse response;
    
    EventBus eventBus;
    @Override
    public void start() throws Exception {
    
    server = vertx.createHttpServer();
    Router router = Router.router(vertx);
    
    eventBus = vertx.eventBus();
    
    router.route("/page1").handler(rc -> {
        response = rc.response();
        response.setChunked(true);
    
        eventBus.send(MyRestAPIVerticle.ALL_ACCOUNT_LISTING, 
            "Yay! Someone kicked a ball",
            ar->{
            if(ar.succeeded()){
                System.out.println("Response is :"+ar.result().body());
            }
            }
            );
    
    });
    
    server.requestHandler(router::accept).listen(9999);
    

    }

    但在我启动它并访问/page1之后,消息根本无法从ServerVerticle发送到apverticle。若我将事件总线使用者移动到和发送方相同的垂直位置,那个么就可以接收事件。

    在两条垂直线之间发送信息有什么问题吗?我怎样才能让它工作?

    提前谢谢。

  • 共有2个答案

    平嘉熙
    2023-03-14

    Vertx事件总线不会像您正在尝试的那样在不同的Vertx实例之间共享(但是集群Vert.x应用程序可以做到这一点)。在您的情况下,将其更改为使用单个顶点。在您的MySpringVertxApplication中,有下面这样的x个实例。

    Vertx vertx = Vertx.vertx();
    vertx.deployVerticle(MyRestAPIVerticle.class.getName());
    vertx.deployVerticle(MyRestAPIServer.class.getName());
    
    闻人升
    2023-03-14

    您在单独的vertx实例中部署了它们:

    Vertx.vertx().deployVerticle(MyRestAPIVerticle);
    Vertx.vertx().deployVerticle(myRestAPIServer);
    

    试试这个:

    Vertx vertx = Vertx.vertx();
    vertx.deployVerticle(MyRestAPIVerticle);
    vertx.deployVerticle(myRestAPIServer);
    
     类似资料:
    • 发送一条消息将导致只有一个Handlers在接收该消息的地址注册。这是点对点的消息传递模式。这个Handlers的选择是一个非严格的循环方式。 发送一条消息时,可以send eventBus.send("news.uk.sport", "Yay! Someone kicked a ball");

    • 当使用send event bus 尝试将消息传递到event bus中注册的MessageConsumer 。 在某些情况下是有用的,发送者知道什么时候,消费者已经收到了消息和”processing”。 要确认该消息已被处理,消费者可以通过调用reply对消息进行回复。 当发生这种情况时,它会导致一个回复,发送回发送端和应答处理程序被调用的答复。 一个例子可以说明这一点: 接收: Message

    • 发布一条消息是简单的。只需使用publish指定地址发布到。 eventBus.publish("news.uk.sport", "Yay! Someone kicked a ball"); 那消息然后将送交注册的反对地址 news.uk.sport 的所有处理程序。

    • 问题内容: 我试图将字符串消息发送到在weblogic服务器中创建的JMS队列中。我使用Eclipse IDE,当我运行Web应用程序时,出现以下错误,tomcat服务器关闭。错误是 请帮助我。谢谢和最诚挚的问候 问题答案: 基于对该问题的一些快速研究,它似乎是由于在应用服务器和客户端之间使用不同的JDK级别引起的。我看到的大多数示例都表明,在Java 5上运行Weblogic时在客户端上使用Ja

    • 我正在尝试使用Vertx上传一个文件,该请求是一个包含PDF的POST请求,我的处理程序如下所示(我从github中的一个示例中获取了代码): 根据上面的评论,我不能只尝试这样的事情(它实际上显示了一个错误): 我一直在检查MessageCodec,但我不清楚如何将其应用于这种情况。 注意:此escenario必须使用eventbus。

    • 我想将发送到Azure服务总线主题的事件发送到事件中心。这可能吗? 详细信息:我与我公司的另一个团队合作,该团队接收Azure Service Bus主题的第三方事件(通过webhook),并在不同的应用程序中进一步使用。 我的团队现在希望使用我们现有的事件中心并使用Azure捕获将这些事件存储到存储帐户来收听/订阅此主题。 我做了以下工作: 我在他们的Azure服务总线中创建了他们主题的订阅。我