Envoi de messages avec RabbitMQ

Effectué

Il est simple d’écrire du code qui crée des files d’attente, envoie des messages et reçoit des messages de RabbitMQ. Dans une solution .NET Aspire, vous bénéficiez également de l’aide pour créer le conteneur RabbitMQ et y établir des connexions à partir de microservices.

Chez votre détaillant d’équipement de plein air, vous avez décidé d’implémenter RabbitMQ comme répartiteur de messages centralisé pour votre site Web de catalogue de produits destiné aux clients. Vous souhaitez utiliser le composant .NET Aspire RabbitMQ pour gérer ce répartiteur et ses files d’attente.

Dans cette unité, vous apprendrez à créer un conteneur RabbitMQ et à l’utiliser pour envoyer et recevoir des messages.

Utilisation du composant .NET Aspire RabbitMQ

Lorsque vous utilisez RabbitMQ à partir de .NET, vous devez généralement créer un ConnectionFactory objet avec une chaîne de connexion et l’utiliser pour établir des connexions au service. Dans un projet .NET Aspire, il est plus facile de gérer la connexion RabbitMQ, car :

  • vous inscrivez une connexion et une chaîne de connexion dans le projet AppHost.
  • Lorsque vous transmettez une référence au service aux projets consommateurs, ils peuvent utiliser l’injection de dépendance pour obtenir une connexion à RabbitMQ. Ces projets n’ont pas besoin de créer et de configurer leurs propres connexions.

Configuration de RabbitMQ dans l’hôte d’application

Dans .NET Aspire, vous devez installer le composant d’hébergement Rabbit MQ dans l’hôte d’application :

dotnet add package Aspire.Hosting.RabbitMQ

À présent, vous pouvez inscrire le service RabbitMQ et le transmettre aux projets qui l’utilisent :

// Service registration
var rabbit = builder.AddRabbitMQ("messaging");

// Service consumption
builder.AddProject<Projects.CatalogAPI>()
       .WithReference(rabbit);

AppHost gère la connexion pour tous les projets de la solution.

Configuration Rab

Ensuite, ajoutez le composant .NET Aspire RabbitMQ à chaque projet qui l’utilise :

dotnet add package Aspire.RabbitMQ.Client

Pour obtenir une référence au répartiteur de messages RabbitMQ, appelez la AddRabbitMQClient() méthode :

builder.AddRabbitMQClient("messaging");

À présent, vous pouvez utiliser l’injection de dépendances pour obtenir la connexion à RabbitMQ :

public class CatalogAPI(IConnection rabbitConnection)
{
    // Send and receive messages here
}

Avec la connexion, l’étape suivante consiste à créer un canal de messagerie, comme suit :

var channel = connection.CreateModel();

Envoi de messages

Une fois que vous avez le canal de messagerie, vous pouvez l’utiliser pour configurer des files d’attente, des échanges et d’autres composants de votre topologie de messagerie. Par exemple, pour créer une file d’attente, utilisez ce code :

channel.QueueDeclare(queue: "catalogEvents",
    durable: false,
    exclusive: false,
    autoDelete: false,
    arguments: null);

Vous utilisez la BasicPublish méthode pour envoyer un message à cette file d’attente, mais le message s’attend à ce que le corps soit un groupe d’octets :

var body = Encoding.UTF8.GetBytes("Getting all items in the catalog.");

channel.BasicPublish(exchange: string.Empty,
    routingKey: "catalogEvents",
    basicProperties: null,
    body: body);

Réception de messages

Dans le composant de réception, vous créez le canal de messagerie et la file d’attente de la même façon que pour l’expéditeur. Vérifiez que le nom de la file d’attente correspond à celui que vous avez créé dans le composant d’envoi. S’il ne correspond pas, vous allez créer deux files d’attente distinctes et les messages n’arriveront pas à la destination correcte.

Vous devez créer une méthode EventingBasicConsumer() et inscrire une méthode pour gérer l’événement Received :

var consumer = new EventingBasicConsumer(channel);
consumer.Received += ProcessMessageAsync;

Le gestionnaire de messages utilise un BasicDeliverEventArgs objet pour obtenir les propriétés du message, y compris le corps du message. Vous devez vous rappeler de désérialiser le corps du message :

private void ProcessMessageAsync(object? sender, BasicDeliverEventArgs args)
{
    string messagetext = Encoding.UTF8.GetString(args.Body.ToArray());
    logger.LogInformation("The message is: {text}", messagetext);
}

Enfin, pour vérifier la file d’attente des nouveaux messages, appelez la BasicConsume() méthode ;

channel.BasicConsume(queue:  queueName,
                    autoAck: true, 
                    consumer: consumer);

En savoir plus