Messagerie avec Spring AMQP

1. Vue d’ensemble

Dans cet article, nous allons explorer la communication basée sur la messagerie via le protocole AMQP à l’aide du cadre Spring AMQP. Premièrement, nous aborderons certains des concepts clés de la messagerie, puis nous passerons à des exemples pratiques à la section 5.

1.1. Dépendances Maven

Pour utiliser spring-amqp et spring-rabbit dans votre projet, ajoutez simplement les dépendances suivantes:

<dependencies>
    <dependency>
        <groupId>org.springframework.amqp</groupId>
        <artifactId>spring-amqp</artifactId>
        <version>1.6.6.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.amqp</groupId>
        <artifactId>spring-rabbit</artifactId>
        <version>1.6.6.RELEASE</version>
    </dependency>
</dependencies>

Vous trouverez les versions les plus récentes dans https://search.maven.org/classic/#search%7Cga%7C1%7C(g%3A%22org.springframework.amqp%22%20AND%20a%3A%22spring-amqp % 22)% 20OR% 20 (g% 3A% 22org.springframework.amqp% 22% 20and% 20a% 3A% 22spring-lapins% 22)[référentiel Maven].

** 2. Communication basée sur la messagerie____

__ **

La messagerie est une technique de communication inter-applications qui repose sur une transmission de message asynchrone au lieu d’une architecture basée sur une réponse de requête synchrone. Le producteur et le consommateur de messages sont découplés par une couche de messagerie intermédiaire appelée courtier de messages. Le courtier de messages fournit des fonctionnalités comme le stockage persistant des messages, le filtrage des messages, la transformation des messages, etc.

En cas d’intercommunication entre des applications écrites en Java, l’API JMS (Java Message Service) est couramment utilisée pour l’envoi et la réception de messages. Pour l’interopérabilité entre différents fournisseurs et plates-formes, nous ne pourrons pas utiliser les clients et les courtiers JMS. C’est ici qu’AMQP est utile.

** 3. AMQP - Advanced Message Queuing Protocol____

__ **

AMQP est une spécification de câble standard ouverte pour la communication basée sur la messagerie asynchrone. Il fournit une description de la manière dont un message devrait être construit. Chaque octet de données transmises est spécifié.

3.1. En quoi AMQP est différent de JMS

AMQP étant un standard de protocole binaire neutre pour la plate-forme, cette caractéristique permet aux bibliothèques d’être écrites dans différents langages de programmation et de s’exécuter sur différents systèmes d’exploitation et architectures de CPU.

Il n’y a pas de verrouillage de protocole basé sur le fournisseur, comme dans le cas de la migration d’un courtier JMS vers un autre. Pour plus de détails, consultez JMS vs AMQP et Comprendre AMQP . RabbitMQ _, _ OpenAMQ et StormMQ sont quelques-uns des courtiers AMQP les plus largement utilisés.

** 3.2. Entités AMQP____

__ **

  • Les entités AMQP comprennent des échanges, des files d’attente et des liaisons: **

  • Les échanges sont comme les bureaux de poste ou les boîtes aux lettres et les clients toujours

publier un message à un échange AMQP ** Les files d’attente se lient pour échanger en utilisant la clé de liaison. Une liaison est "lien"

que vous avez configuré pour lier une file d’attente à un échange ** Les messages sont envoyés au courtier/échange de messages avec une clé de routage. le

Exchange distribue ensuite des copies des messages aux files d’attente. Exchange fournit l’abstraction nécessaire pour réaliser différents routages de messagerie, tels que la répartition, le routage hiérarchique, etc.

3.3. Types d’échange

  1. Il existe quatre types d’échange intégrés:

    • Échange direct

    • Échange de fanout

    • Échange de sujet

    • Échange d’en-têtes

Pour plus de détails, consultez AMQP Concepts et https://spring.io/blog/2011/04/01/routing-topologies- for-performance-and-scalability-with-rabbitmq/[topologies de routage]

** 4. Printemps AMQP____

__ **

Spring AMQP comprend deux modules: Spring-Amqp et Spring-Lapin, chacun représenté par un pot dans la distribution. printemps-

Spring-amqp est l’abstraction de base et vous trouverez les classes représentant le modèle AMQP principal: Exchange, Queue et Binding. .

Nous aborderons ci-dessous les caractéristiques spécifiques du lapin de printemps dans l’article.

** 4.1. Printemps-Amqp Caractéristiques____

__ **

  • Abstraction basée sur des modèles - L’interface AMQPTemplate définit tout

opérations de base pour l’envoi/la réception de messages, avec RabbitTemplate comme la mise en œuvre Confirmations de l’éditeur/remerciements des consommateurs ** support

  • AmqpAdmin outil permettant d’effectuer des opérations de base

** 4.2. Caractéristiques du lapin printanier____

__ **

Le modèle AMQP et les entités associées décrites ci-dessus sont génériques et applicables à toutes les implémentations. Cependant, certaines caractéristiques sont spécifiques à la mise en œuvre. Quelques caractéristiques de ce lapin de printemps sont expliquées ci-dessous.

  • Prise en charge de la gestion des connexions ** - L’interface org.springframework.amqp.rabbit.connection.ConnectionFactory est le composant central pour la gestion des connexions au courtier RabbitMQ. L’implémentation de CachingConnectionFactory de l’interface ConnectionFactory consiste à fournir une instance de l’interface org.springframework.amqp.rabbit.connection.Connection .

Veuillez noter que spring-rabbit fournit une interface Connection comme wrapper sur l’interface com.rabbitmq.client.Connection du client RabbitMQ.

  • Consommation de message asynchrone ** - Pour la consommation de message asynchrone, deux concepts clés sont un rappel et un conteneur. Le rappel est l’endroit où votre code d’application sera intégré au système de messagerie.

L’un des moyens de coder un rappel consiste à fournir une implémentation de l’interface MessageListener :

public interface MessageListener {
    void onMessage(Message message);
}

Afin de séparer clairement le code d’application et l’API de messagerie, Spring AMQP fournit également MessageListenerAdapter . Voici un exemple de configuration du bean Spring pour le conteneur d’écoute:

MessageListenerAdapter listener = new MessageListenerAdapter(somePojo);
listener.setDefaultListenerMethod("myMethod");

Maintenant que nous avons vu les différentes options pour le rappel par message-écoute, nous pouvons nous tourner vers le conteneur. Fondamentalement, le conteneur gère les responsabilités «actives» afin que le rappel de l’auditeur puisse rester passif. Le conteneur est un exemple de composant de cycle de vie. Il fournit des méthodes pour démarrer et arrêter.

Lors de la configuration du conteneur, vous établissez essentiellement un pont entre une file d’attente AMQP et l’instance MessageListener . Par défaut, le conteneur d’écoute va démarrer un seul consommateur qui recevra les messages des files d’attente.

** 5. Envoi et réception de messages à l’aide de Spring AMQP____

__ **

Voici les étapes à suivre pour envoyer et recevoir un message via Spring AMQP:

  1. Installation et démarrage du courtier RabbitMQ - L’installation et la configuration de RabbitMQ est

simple, il suffit de suivre les étapes mentionnées here . Configurer un projet Java - Créez un projet Java basé sur Maven avec

dépendances mentionnées ci-dessus . Implémenter Message Producer - Nous pouvons utiliser RabbitTemplate pour envoyer un message.

Message «Bonjour le monde!»:

AbstractApplicationContext ctx
  = new ClassPathXmlApplicationContext("beans.xml");
AmqpTemplate template = ctx.getBean(RabbitTemplate.class);
template.convertAndSend("Hello, world!");
  1. Implement Message Consumer - Comme indiqué précédemment, nous pouvons implémenter

message consommateur en tant que POJO:

+[source, xml, gouttière:, vrai]

public class Consumer {
    public void listen(String foo) {
        System.out.println(foo);
    }
}
  1. Dépendances de câblage - Nous utiliserons le haricot de printemps suivant

configuration pour la configuration des files d’attente, des échanges et d’autres entités. La plupart des entrées sont explicites. La file d’attente nommée «myQueue» est liée au sujet d’échange «myExchange» en utilisant «foo. ** » Comme clé de liaison.

RabbitTemplate a été configuré pour envoyer des messages à «myExchange» Exchange avec «foo.bar» comme clé de routage par défaut. ListenerContainer assure une livraison asynchrone des messages de la file d’attente «myQueue» à la méthode listen () de la classe Foo :

+[source, xml, gouttière:, vrai]

<rabbit:connection-factory id="connectionFactory"
  host="localhost" username="guest" password="guest"/>

<rabbit:template id="amqpTemplate" connection-factory="connectionFactory"
    exchange="myExchange" routing-key="foo.bar"/>

<rabbit:admin connection-factory="connectionFactory"/>

<rabbit:queue name="myQueue"/>

<rabbit:topic-exchange name="myExchange">
    <rabbit:bindings>
        <rabbit:binding queue="myQueue" pattern="foo.** "/>
    </rabbit:bindings>
</rabbit:topic-exchange>

<rabbit:listener-container connection-factory="connectionFactory">
    <rabbit:listener ref="consumer" method="listen" queue-names="myQueue"/>
</rabbit:listener-container>

<bean id="consumer" class="com.baeldung.springamqp.consumer.Consumer"/>
  • Remarque ** : Par défaut, pour vous connecter à l’instance locale RabbitMQ, utilisez le nom d’utilisateur “guest” et le mot de passe “guest”.

    1. Lancer l’application:

  • La première étape consiste à s’assurer que RabbitMQ est en cours d’exécution, le port par défaut étant

  • Exécutez l’application en exécutant Producer.java , en exécutant le main ()

méthode ** Le producteur envoie le message à “myExchange” avec “foo.bar” ​​comme

clé de routage ** Selon la clé de liaison de “myQueue”, il reçoit le message

  • Foo class qui consomme des messages «myQueue» avec listen ()

méthode en tant que rappel reçoit le message et l’imprime sur la console

6. Conclusion

Dans cet article, nous avons décrit l’architecture basée sur la messagerie via le protocole AMQP en utilisant Spring AMQP pour la communication entre applications.

Le code source complet et tous les extraits de code pour cet article sont disponibles sur le projet GitHub .