Exchanges dans RabbitMQ

RabbitMQ est construit sur AMQP 0.9. Il implémente la notion d'exchange conformément à cette spécification.

Un exchange sert à un producteur pour envoyer des messages. Il ne stocke aucune message, il n’est qu’un point de passage.

Caractéristiques

Un exchange a les caractéristiques suivantes:

  • name, unique dans le virtual host,

  • type, direct, topic, fanout ou headers,

  • durable, s’il survit au redémarrage du serveur,

  • auto-delete, supprimée quand le dernier consommateur se désabonne,

Définition

  "exchanges": [
    {
      "name": "x.activity.ride",
      "type": "topic",
      "auto_delete": false,
      "durable": true
    }
  ]

Client Java

Déclaration d’un exchange

En version courte:

channel.exchangeDeclare(
    "q.activity.ride",
    "direct"      // type
);

En version longue:

channel.exchangeDeclare(
    "x.activity",
    "direct",     // type
    true,         // durable
    false,        // not auto-delete
    Map.of()      // no argument
);

Utilisation d’un exchange

En AMQP 0.9, utiliser un exchange signifie y publier des messages.

String message = "This is a message.";
channel.basicPublish(
    "x.activity",
    "ABC",          // routing key (see binding)
    null,           // properties
    message.getBytes());

Spring AMQP

Déclaration d’un exchange

@Component
public class MessageService {
  private final AmqpAdmin admin;

  public void createExchange(String name) {
    admin.declareExchange(
        ExchangeBuilder.topicExchange(name).durable(true).build());
  }

  ...
}

Utilisation d’un exchange

La valeur ajoutée de Spring c’est RabbitTemplate que peut publier n’importe que type d’objet et le transformant, en JSON par exemple, avant d’en faire un byte[].

@Component
public class MessageService {
  private final AmqpAdmin admin;

  public void publish(Activity activity) {
    rabbitTemplate.convertAndSend(
            "x.activity",
            activity.key,   // routing key (see binding)
            activity);
  }

  ...
}