RabbitMq

Hand-on labs for RabbitMQ

Message broker, AMQP, Connection, Exchange, Binding, queue, asynchronous, RabbitTemplate, spring-boot-starter-amqp, message, publisher, consumer: On va essayer à comprendre ces termes une par une dans quelques mots par contre c’est que suite c’est juste the INTRO. Aussi on va faire de pratique et non pas juste de théorique with SPRING framework :D

On suppose que quand on commande sur un site e-commerce un produit on va recevoir un mail de confirmation de notre commande avec toutes les détails. On va développer deux application, une pour passer la commande et l’autre pour envoyer l’email. Donc ces deux application devons se communiquer entre eux pour faire les traitements nécessaires, et on ne veut pas que ces deux là avoir une communication direct (via HTTP call), pour s’assurer la délivrance des mails. Donc, on peut utiliser une chose s’appelle “Message broker

Ce dernier, va représenter un système qui reçoit les données sous forme d’un message et le communique vers le destinataire, sans avoir une communication direct entre la source et la destination.

Pour le message broker, il existe plusieurs logiciel qui sont open source comme RabbitMq, kafka,… dans notre article on va prendre RabbitMQ qui est un logiciel qui se basant sur le standard AMQP.

Composants RabbitMq broker

Connection: Ouvrir une connexion entre l’application source et le broker.

Channel: Une fois la connexion est ouverte, on ouvre un channel. Pour une connexion TCP ouvert on peut lui affecter plusieurs channel.

it is undesirable to keep many TCP connections open at the same time because doing so consumes system resources and makes it more difficult to configure firewalls <RabbitMq Ref>

Exchange: C’est le point où notre message envoyé par la source sera déposé. Il y a 4 type d’exchange. Fnaout, Header, Topic, Direct. Dans la suite de notre exemple on va utiliser le Direct exchange.

Binding: Entre l’exchange et la Queue on pourra appliquer un binding. Et selon ce binding on définit quel message sera envoyer pour quel Queue.

Spring and Rabbit

On va développer notre solution de site e-commerce on utilisons le framework spring, et une image de RabbitMq dans le lien suivant:

https://hub.docker.com/_/rabbitmq?tab=description

On va commencer par la configuration de notre broker où on va créer un exchange de type Direct nommé exchange_test et un Queue nommé queue_test

Pour lancer une instance de l’image RabbitMq (Container) tapez la ligne suivante:

docker run -d — hostname my-rabbit — name example-rabbit -p 5672:5672 -p 25672:25672 -p 15672:15672 rabbitmq:3-management

Comme vous l’avez remarqué, j’ai exporté les ports (-p) de container pour qu’on puissent l’utiliser par la suite.

Tapez la commande suivante pour voire la liste des container qui sont en cours d’éxecution et vous devez trouver notre container avec le nom example-rabbit:

docker container ls

Dans votre navigateur, vous pouvez ouvrir l’url RabbitMq management avec l’url suivant:

http://localhost:15672/#/
RabbitMq management Overview
  • Cliquez sur le lien Exchanges
  • Déplacez tout en bas
RabbitMq Add a new exchange
  • Entrez le nom de ce nouveau exchange: exchange_test
  • Changez le type Direct
  • Appuyez sur Add exchange

→ Et voilà vous venez de créer votre première exchange

On passe vers la création de Queue.

  • Appuyez sur Queues
RabbitMq Add a new queue
  • Tapez dans champ Name: queue_test
  • Appuyez sur Add queue

→ Queue est vient d’être créé

Maintenant on va configurer le binding entre l’exchange et le queue créé. Il faut retourner sur le menu Exchange et chercher dans le tableau afficher votre exchange que vous l’avez créé (exchange_test) et appuyez sur cette ligne.

RabbitMq Add biniding

Dans cette interface on va ajouter un binding pour notre exchange et notre queue.

  • Le premier champ saisi queue_test
  • dans le champ Routning key saisi my_personal_key
  • Appuyez sur bind
Notre RabbitMQ

On passe à nos applications spring…

I- Créer votre projet responsable d’enregistrement des commandes

(on utilisons https://start.spring.io/)

Créer un nouveau classe Commander et insérez le code suivant:

@RestController
public class Commander {

@Autowired
private RabbitTemplate rabbitTemplate;

@PostMapping("/commander")
public HttpEntity<String> addUserCnt(String commander) {

//we suppose that you called to your repository to persist the data //of command and you have the Id of the command
//the new line is Object that will be send to our broker
Message msg =Message.builder().id(1L).comment("My comment").build();
//new line is to publish the message to our broker
rabbitTemplate.convertAndSend("exchange_test","my_personal_key",msg;
 return new HttpEntity("Commande passé");
}
}

@Data
@ToString
@Builder
public class Message implements Serializable {

private Long id;
private String comment;
}

RabbitTempalte: Ce class est appartient à la package org.springframework.amqp.rabbit.core et utiliser pour envoyer/recevoir de notre broker.

La fonction convertAndSend est utilisé pour envoyer notre message vers le broker; Tel que on passe l’exchange sur lequel on publie notre message, le key de routing que sera utiliser pour spécifier la queue sur lequel sera envoyer ce message et le dernier paramètre c’est votre message à transférer.

http://localhost:8080/commander

II- Créer un nouveau projet qui sera responsable de consommer les messages envoyés dans le broker et effectuer un envoi de mail.

GroupId: com.bergit

ArtifactId: consumer

dépendances: RabbitMq, lombok

Créer une classe ConsumerService.java et insérez le code suivant:

@Service
public class ConsumerService {

@RabbitListener(id = "new-input-listener",
bindings = {@QueueBinding(value = @Queue(value = "queue_test"),key = "my_personal_key",exchange = @Exchange(value = "exchange_test", type = ExchangeTypes.DIRECT)),
})
public void onNewEvent(Message object) {
System.out.println("=============================");
System.out.println("received message "+object.toString());
System.out.println("=============================");
//You can now get the command by his id and send a mail....
}
}

Ici on’a créé un service s’appelle ConsumerService et on’a inséré le code qui permet de consommer les messages reçu dans le broker dans le queue queue_test et le clé my_personal_key

Dés que vous lancez le projet, vous auriez dans ton terminal l’affichage des messages que vous l’avez publié on appelant le producer.

Et voilà, vous venez de mettre le nez en RabbitMQ, mais Il faut travailler plus pour maitriser RabbitMQ…

Merci pour votre temps ^^