Skip to main content

EventBus Vert.x

La communication asynchrone entre les différents modules se fait par l'EventBus de Vert.x - the nervous system of Vert.x !

Chaque message envoyé via l'Event Bus est associé à une adresse (une chaîne de caractères). Les consommateurs (consumers) s'abonnent à une adresse spécifique, et les producteurs (producers) envoient des messages à cette adresse.

L'Event Bus de Vert.x est un composant central de l'architecture de Vert.x, conçu pour permettre la communication asynchrone entre différents composants d'une application Vert.x. Il s'agit d'un système de messagerie distribué léger qui permet aux verticles (unités d'exécution légères) de communiquer entre eux de manière très flexible, que ce soit au sein du même JVM ou à travers plusieurs JVMs, même sur différents nœuds dans un cluster.

Principes de base de l'Event Bus

  1. Adresses et Messagerie :

    • Chaque message envoyé via l'Event Bus est associé à une adresse (une chaîne de caractères). Les consommateurs (consumers) s'abonnent à une adresse spécifique, et les producteurs (producers) envoient des messages à cette adresse.
    • Un producteur peut envoyer des messages à plusieurs consommateurs en utilisant une seule adresse.
  2. Types de Communication : L'Event Bus prend en charge plusieurs types de communication :

    • Send : Envoie un message à un seul consommateur abonné à une adresse. Le consommateur est sélectionné de manière aléatoire si plusieurs consommateurs sont enregistrés sur la même adresse.
    • Publish : Publie un message à tous les consommateurs abonnés à une adresse donnée.
    • Request-Reply : Un pattern couramment utilisé où un message est envoyé à un consommateur, et le producteur attend une réponse.
  3. Handler de messages (Message Handlers) :

    • Les consommateurs s'enregistrent sur l'Event Bus en utilisant des handlers de messages. Un handler de message est simplement une fonction ou une méthode qui est appelée lorsqu'un message est reçu sur l'adresse à laquelle le consommateur est abonné.
  4. Clustering :

    • L'Event Bus peut fonctionner en mode distribué, permettant ainsi aux verticles répartis sur différents nœuds de communiquer via l'Event Bus. Cela se fait de manière transparente, et les messages peuvent être envoyés entre nœuds comme s'ils étaient sur le même JVM.

Comment utiliser l'Event Bus

Voici un exemple simple montrant comment utiliser l'Event Bus dans une application Vert.x.

1. Envoi d'un message (Send)

Vertx vertx = Vertx.vertx();
EventBus eventBus = vertx.eventBus();

eventBus.send("some.address", "Hello World!");

2. Publication d'un message (Publish)

eventBus.publish("news.uk.sport", "A new article on UK sports!");

3. Consommation de messages

eventBus.consumer("some.address", message -> {
System.out.println("Received message: " + message.body());
});

4. Request-Reply Pattern

// Consommateur
eventBus.consumer("request.address", message -> {
System.out.println("Received request: " + message.body());
message.reply("This is the reply");
});

// Producteur
eventBus.request("request.address", "Request Message", ar -> {
if (ar.succeeded()) {
System.out.println("Received reply: " + ar.result().body());
} else {
System.out.println("Failed to receive reply");
}
});

Caractéristiques avancées

  1. Messages JSON :

    • Vert.x supporte nativement les messages JSON, ce qui permet d'envoyer des objets JSON sous forme de messages sur l'Event Bus.
    JsonObject json = new JsonObject().put("key", "value");
    eventBus.send("json.address", json);
  2. Codec personnalisé :

    • Pour envoyer des objets complexes non JSON, vous pouvez créer un codec personnalisé pour encoder et décoder ces objets lors de l'envoi et de la réception sur l'Event Bus.
  3. Clustering :

    • L'Event Bus peut être configuré pour fonctionner en mode cluster, permettant la communication entre verticles sur différents nœuds dans un réseau. Cela nécessite une configuration de clustering, par exemple avec Hazelcast.

Adresses des messages Open ENT

Modules consommateurModule producteurAdresse de l'Event BusDescription / Utilisation
CommunicationTous les moduleswse.communication.usersListe des utilisateurs connectés
CommunicationTous les moduleswse.communicationEnvoi de mail connectés
AppRegistryTous les moduleswse.app.registry.applicationsListe des applications
WorkspaceTous les modulesorg.entcore.workspaceEchange de documents dans l'espace documentaire
DirectoryTous les modulesuserbook.preferencesPréférence utilisateur
DirectoryTous les modulesuser.repositoryPermet de controler les données d'import/d'export pour chaque module. (Event local à un module)
PortalTous les moduleswse.timelineEnvoi des messages de mise à jour dans la page de garde
InfraTous les modulesentcore.smsEnvoi de SMS
DirectoryTous les modulesentcore.directoryConsultation de l'annuaire
FeederTous les modulesentcore.feederEnvoi d'instruction d'import/export de données
[Auth]App Registrycas.configurationRecupération de la configuration CAS