Messagerie avec Spring AMQP

1. Vue d'ensemble

Dans ce didacticiel, nous explorerons la communication basée sur les messages sur AMQP à l'aide du framework Spring AMQP. Tout d'abord, nous aborderons certains des concepts clés de la messagerie. Ensuite, nous passerons à un exemple pratique.

2. Communication basée sur les messages

La messagerie est une technique de communication entre applications. Il repose sur la transmission de messages asynchrone au lieu d'une architecture basée sur les demandes synchrones. Les producteurs et les consommateurs de messages sont découplés par une couche de messagerie intermédiaire appelée courtier de messages . Un courtier de messages fournit des fonctionnalités telles que le stockage permanent des messages, le filtrage des messages et la transformation des messages.

Dans le cas d'une messagerie entre applications écrites en Java, l'API JMS (Java Message Service) est couramment utilisée. Pour l'interopérabilité entre différents fournisseurs et plates-formes, nous ne serons pas en mesure d'utiliser les clients et les courtiers JMS. C'est là que l'AMQP est utile .

3. AMQP - Protocole avancé de Message Queuing

AMQP est une spécification de fil standard ouverte pour la communication de message asynchrone. Il fournit une description de la manière dont un message doit être construit.

3.1. En quoi Amqp est différent de Jms

Étant donné que AMQP est une norme de protocole binaire indépendante de la plate-forme, les bibliothèques peuvent être écrites dans différents langages de programmation et fonctionner sur différents environnements.

Il n'y a pas de verrouillage de protocole basé sur le fournisseur, comme c'est le cas lors de la migration d'un courtier JMS à un autre. Pour plus de détails, reportez-vous à JMS vs AMQP et Comprendre AMQP. Certains des courtiers AMQP largement utilisés sont RabbitMQ , OpenAMQ et StormMQ.

3.2. Entités AMQP

En bref, AMQP est composé d'échanges, de files d'attente et de liaisons:

  • Les échanges sont comme des bureaux de poste ou des boîtes aux lettres et les clients publient un message dans un échange AMQP. Il existe quatre types d'échange intégrés
    • Direct Exchange - achemine les messages vers une file d'attente en faisant correspondre une clé de routage complète
    • Fanout Exchange - Achemine les messages vers toutes les files d'attente qui lui sont liées
    • Échange de sujets: achemine les messages vers plusieurs files d'attente en faisant correspondre une clé de routage à un modèle
    • Échange d'en-têtes - achemine les messages en fonction des en-têtes de message
  • Les files d'attente sont liées à un échange à l'aide d'une clé de routage
  • Les messages sont envoyés à un échange avec une clé de routage. L'échange distribue ensuite des copies des messages dans les files d'attente

Pour plus de détails, consultez les concepts AMQP et les topologies de routage.

3.3. AMQP de printemps

Spring AMQP comprend deux modules: spring-amqp et spring-rabbit . Ensemble, ces modules fournissent des abstractions pour:

  • Entités AMQP - nous créons des entités avec les classes Message, Queue, Binding et Exchange

  • Gestion des connexions - nous nous connectons à notre courtier RabbitMQ en utilisant un CachingConnectionFactory
  • Publication de messages - nous utilisons un RabbitTemplate pour envoyer des messages
  • Consommation de messages - nous utilisons un @RabbitListener pour lire les messages d'une file d'attente

4. Configurer un courtier Rabbitmq

Nous avons besoin d'un courtier RabbitMQ disponible pour nous connecter. Le moyen le plus simple de le faire est d'utiliser Docker pour récupérer et exécuter une image RabbitMQ pour nous:

docker run -d -p 5672:5672 -p 15672:15672 --name my-rabbit rabbitmq:3-management

Nous exposons le port 5672 afin que notre application puisse se connecter à RabbitMQ.

Et, nous exposons le port 15672 afin que nous puissions voir ce que notre courtier RabbitMQ fait via l'interface de gestion: // localhost: 15672 ou l'API HTTP: //localhost:15672/api/index.html .

5. Création de notre application Spring Amqp

Alors, créons maintenant notre application pour envoyer et recevoir un simple "Hello, world!" message en utilisant Spring AMQP.

5.1. Dépendances de Maven

Afin d'ajouter les modules spring-amqp et spring-rabbit à notre projet, nous ajoutons la dépendance spring-boot-starter-amqp à notre pom.xml :

  org.springframework.boot spring-boot-starter-amqp 2.2.2.RELEASE  

Nous pouvons trouver la dernière version sur Maven Central.

5.2. Connexion à notre courtier Rabbitmq

Nous allons utiliser la configuration automatique de Spring Boot pour créer nos ConnectionFactory , RabbitTemplate et RabbitAdmin haricots . En conséquence, nous obtenons une connexion à notre courtier RabbitMQ sur le port 5672 en utilisant le nom d'utilisateur et le mot de passe par défaut «invité». Donc, nous annotons simplement notre application avec @SpringBootApplication :

@SpringBootApplication public class HelloWorldMessageApp { // ... }

5.3. Créer notre file d'attente

Afin de créer notre file d'attente, nous définissons simplement un bean de type Queue . RabbitAdmin le trouvera et le liera à l'échange par défaut avec une clé de routage «myQueue»:

@Bean public Queue myQueue() { return new Queue("myQueue", false); }

Nous avons défini la file d'attente pour qu'elle ne soit pas durable afin que la file d'attente et tous les messages qu'elle contient soient supprimés lorsque RabbitMQ est arrêté. Notez cependant que le redémarrage de notre application n'aura aucun effet sur la file d'attente.

5.4. Envoyez notre message

Utilisons le RabbitTemplate pour envoyer notre "Hello, world!" message:

rabbitTemplate.convertAndSend("myQueue", "Hello, world!");

5.5. Consommez notre message

Nous implémenterons un consommateur de message en annotant une méthode avec @RabbitListener :

@RabbitListener(queues = "myQueue") public void listen(String in) { System.out.println("Message read from myQueue : " + in); }

6. Exécution de notre application

Tout d'abord, nous démarrons le courtier RabbitMQ:

docker run -d -p 5672:5672 -p 15672:15672 --name my-rabbit rabbitmq:3-management

Ensuite, nous exécutons l'application de démarrage de printemps en exécutant HelloWorldMessage.java , en exécutant la méthode main () :

mvn spring-boot:run -Dstart-class=com.baeldung.springamqp.simple.HelloWorldMessageApp

Pendant que l'application est en cours d'exécution, nous verrons que:

  • L'application envoie un message à l'échange par défaut avec «myQueue» comme clé de routage
  • Ensuite, la file d'attente «myQueue» reçoit le message
  • Enfin, la méthode listen consomme le message de «myQueue» et l’imprime sur la console

Nous pouvons également utiliser la page de gestion RabbitMQ à l'adresse // localhost: 15672 pour voir que notre message a été envoyé et consommé.

7. Conclusion

Dans ce didacticiel, nous avons couvert l'architecture basée sur la messagerie sur le protocole AMQP à l'aide de Spring AMQP pour la communication entre les applications.

Le code source complet et tous les extraits de code de ce didacticiel sont disponibles sur le projet GitHub.