javavert.xvertx-eventbus

How to use Vertx EventBus to send messages between Verticles?


I am currently maintaining application written in Java with Vertx framework. I would like to implement sending messages between 2 application instances (primary and secondary) using EventBus (over the network). Is it possible? In the Vertx documentation I do not see the example how I can achieve that. https://vertx.io/docs/vertx-core/java/#event_bus I see that there are send(...) methods in EventBus with address - but address can be any String. I would like to publish the events to another application instance (for example from Primary to Secondary).


Solution

  • It is possible using a Vert.x cluster manager.

    Choose one of the supported cluster managers in the classpath of your application.

    In your main method, instead of creating a standalone Vertx instance, create a clustered one:

    Vertx.clusteredVertx(new VertxOptions(), res -> {
      if (res.succeeded()) {
        Vertx vertx = res.result();
      } else {
        // failed!
      }
    });
    

    Deploy a receiver:

    public class Receiver extends AbstractVerticle {
    
      @Override
      public void start() throws Exception {
    
        EventBus eb = vertx.eventBus();
    
        eb.consumer("ping-address", message -> {
    
          System.out.println("Received message: " + message.body());
          // Now send back reply
          message.reply("pong!");
        });
    
        System.out.println("Receiver ready!");
      }
    }
    

    In a separate JVM, deploy a sender:

    public class Sender extends AbstractVerticle {
    
      @Override
      public void start() throws Exception {
        EventBus eb = vertx.eventBus();
    
        // Send a message every second
    
        vertx.setPeriodic(1000, v -> {
    
          eb.request("ping-address", "ping!", reply -> {
            if (reply.succeeded()) {
              System.out.println("Received reply " + reply.result().body());
            } else {
              System.out.println("No reply");
            }
          });
    
        });
      }
    }
    

    That's it for the basics. You may need to follow individual cluster manager configuration instructions in the docs.