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);
}
...
}
Références