Utilisation de la classe utilitaire d'émission RabbitMQ dans un Controller

Classe utilitaire pour l'envoi de messages RabbitMQ

Le code suivant présente une implémentation permettant d'envoyer des messages via RabbitMQ :

@Component
public class Emetteur {
    @Autowired
    private AmqpTemplate rabbitTemplate;
    
    public void envoyer(String cleRouting, String message) {
        this.rabbitTemplate.convertAndSend(cleRouting, message);
    }
    
    public void envoyer(String exchange, String cleRouting, String message) {
        this.rabbitTemplate.convertAndSend(exchange, cleRouting, message);
    }
}

Les méthodes envoyer() encapsulent le mécanisme d'envoi de messages RabbitMQ en utilisant AmqpTemplate (plus spécifiquement rabbitTemplate). Analysons en détail ces deux implémentations et leurs implications :

  1. envoyer(String cleRouting, String message)
public void envoyer(String cleRouting, String message) {
    this.rabbitTemplate.convertAndSend(cleRouting, message);
}

Détails d'implémentation : Cette méthode appelle rabbitTemplate.convertAndSend(cleRouting, message) où :

  • cleRouting : la clé de routage utilisée pour l'envoi du message
  • message : le contenu du message à transmettre

Comportement par défaut : Si seule la clé de routage est spécifiée sans exchange, RabbitMQ utilise l'exchange par défaut (Default Exchange). Cet exchange est un exchange direct qui route les messages vers les queues dont le nom correspond exactement à la clé de routage.

Cas d'utilisation : Cette approche convient pour le routage simple lorsqu'une seule clé de routage détermine la destination du message. Si la clé de routage correspond au nom de la queue, RabbitMQ oriente le message directement vers cette queue.

Exemple : L'appel emetteur.envoyer("FILE_ATTENTE_BIENVENUE", "message1") transmet le message via l'exchange par défaut, en utilisant FILE_ATTENTE_BIENVENUE comme clé de routage vers la queue du même nom.

  1. envoyer(String exchange, String cleRouting, String message)
public void envoyer(String exchange, String cleRouting, String message) {
    this.rabbitTemplate.convertAndSend(exchange, cleRouting, message);
}

Détails d'implémentation : Cette méthode permet de spécifier l'exchange lors de l'envoi. Elle appelle rabbitTemplate.convertAndSend(exchange, cleRouting, message) où :

  • exchange : l'exchange par lequel le message sera envoyé
  • cleRouting : la clé de routage au sein de cet exchange
  • message : le contenu du message

Comportement personnalisé : Le développeur peut spécifier explicitement l'exchange à utiliser et combiner différents types d'exchanges (topic, direct, fanout) avec des clés de routage pour un routage flexible.

Cas d'utilisation : Cette méthode répond aux besoins de routage complexes, comme l'envoi vers un exchange particulier ou l'utilisation de règles de routage différentes pour plusieurs queues. Elle permet de définir divers exchanges et clés de routage selon les exigences.

Exemple : L'appel emetteur.envoyer("Exchange@topic.accueil", "salutation.b", "message2") envoie le message vers l'exchange topic Exchange@topic.accueil avec la clé de routage salutation.b. L'exchange route alors le message vers les queues correspondantes selon ses règles de liaison.

Comparaison des deux méthodes

La première méthode utilise uniquement la clé de routage&nbps;: le message emprunte l'exchagne par défaut avec un routage simple, adapté à l'envoi vers une queue unique.

La deuxième méthode spécifie exchange et clé de routage&nbps;: le message peut être envoyé via différents types d'exchanges, offrant un routage plus flexible pour les scénarios complexes.

Utilisation dans un Controller

public class ControleurSalutation {
    @Autowired
    private MessageDispatcher messageDispatcher;

    @ApiOperation("Envoyer vers la queue hi")
    @PostMapping("hi")
    public void saluer() {
        messageDispatcher.envoyer(RabbitMQConstant.FILE_ATTENTE_HI, "message hi:" + LocalDateTime.now());
    }

    @ApiOperation("Envoyer vers une route spécifiée")
    @PostMapping("bonjour1")
    public void bonjour1() {
        messageDispatcher.envoyer("salutation.a", "message bonjour1:" + LocalDateTime.now());
    }

    @ApiOperation("Envoyer vers un exchange et une route")
    @PostMapping("bonjour2")
    public void bonjour2() {
        messageDispatcher.envoyer("Exchange@topic.accueil", "salutation.b", "message bonjour2:" + LocalDateTime.now());
    }
}

Méthode saluer() :

messageDispatcher.envoyer(RabbitMQConstant.FILE_ATTENTE_HI, "message hi:" + LocalDateTime.now());

Cette méthode appelle la première version de envoyer(), transmettant le message vers la queue FILE_ATTENTE_HI via l'exchange par défaut. La clé de routage exacte permet le routage direct vers la queue correspondante.

Méthode bonjour1() :

messageDispatcher.envoyer("salutation.a", "message bonjour1:" + LocalDateTime.now());

Appelle également la première méthode envoyer(). Le message emprunte l'exchange par défaut avec salutation.a comme clé de routage. Le comportement dépend de la présence d'une queue liée à cette clé.

Méthode bonjour2() :

messageDispatcher.envoyer("Exchange@topic.accueil", "salutation.b", "message bonjour2:" + LocalDateTime.now());

Cette méthode utilise la deuxième version de envoyer(), spécifiant explicitement l'exchange Exchange@topic.accueil et la clé de routage salutation.b. Le message est routé par l'exchange topic selon les règles de correspondance.

Cas particulier&nbps;: le routage avec jokers

Lorsque la clé de routage contient des caractères génériques comme salutation.* (avec joker, pas de correspondanec exacte), seule la deuxième méthode d'envoi peut être utilisée. L'exchange par défaut ne prend pas en charge les jokers.

Appel de la première méthode :

public void envoyer(String cleRouting, String message) {
    this.rabbitTemplate.convertAndSend(cleRouting, message);
}

Lors de l'appel de cette méthode avec salutation.* comme clé de routage, RabbitMQ tente d'utiliser l'exchange par défaut (exchange direct). L'exchange par défaut ne supporet que les correspondances exactes : la clé de routage doit correspondre parfaitement au nom de la queue. Par conséquent, le message ne peut être routé vers aucune queue.

Appel de la deuxième méthode :

public void envoyer(String exchange, String cleRouting, String message) {
    this.rabbitTemplate.convertAndSend(exchange, cleRouting, message);
}

Avec cette méthode, vous pouvez spécifier un exchange topic (par exemple Exchange@topic.accueil) et passer salutation.* comme clé de routage. Les exchanges topic supportent les jokers, permettant ainsi à RabbitMQ de router le message vers les queues correspondant selon les règles de liaison.

Voilà l'intérêt du polymorphisme des méthodes envoyer().

Étiquettes: rabbitmq Spring-AMQP message-queue Java exchange

Publié le 4 août à 14h35