Enviar mensagens com o RabbitMQ

Concluído

É simples gravar código que cria filas, envia mensagens e recebe mensagens do RabbitMQ. Em uma solução .NET Aspire, você também tem ajuda para criar o contêiner do RabbitMQ e fazer conexões com ele a partir de microsserviços.

Em seu varejista de equipamentos ao ar livre, você decidiu implementar o RabbitMQ como um agente de mensagens centralizado para seu site de catálogo de produtos voltado para o cliente. Você deseja usar a integração do .NET Aspire RabbitMQ para gerenciar esse agente e suas filas.

Nesta unidade, você aprenderá a criar um contêiner do RabbitMQ e usá-lo para enviar e receber mensagens.

Usando a integração do .NET Aspire RabbitMQ

Ao usar o RabbitMQ do .NET, você geralmente precisa criar um objeto ConnectionFactory com uma cadeia de conexão e usá-lo para fazer conexões com o serviço. Em um projeto do .NET Aspire, é mais fácil gerenciar a conexão do RabbitMQ porque:

  • Você registra uma conexão e uma cadeia de conexão no projeto AppHost.
  • Quando você passa uma referência ao serviço para consumir projetos, eles podem usar a injeção de dependência para obter uma conexão com o RabbitMQ. Eles não precisam criar e configurar suas próprias conexões.

Configurar o RabbitMQ no host do aplicativo

No .NET Aspire, você deve instalar a integração de hospedagem do Rabbit MQ no host do aplicativo:

dotnet add package Aspire.Hosting.RabbitMQ

Agora, é possível registrar o serviço RabbitMQ e passá-lo para projetos que o usam:

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

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

O AppHost gerencia a conexão para todos os projetos na solução.

Configurar o Rab

Em seguida, adicione a integração do .NET Aspire RabbitMQ a cada projeto que a usa:

dotnet add package Aspire.RabbitMQ.Client

Para obter uma referência ao agente de mensagens do RabbitMQ, chame o método AddRabbitMQClient():

builder.AddRabbitMQClient("messaging");

Agora, é possível usar a injeção de dependência para obter a conexão com o RabbitMQ:

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

Com a conexão, a próxima etapa é criar um canal de mensagens, desta forma:

var channel = connection.CreateModel();

Enviar mensagens

Depois de ter o canal de mensagens, você poderá usá-lo para configurar filas, trocas e outras integrações da topologia de mensagens. Por exemplo, para criar uma fila, use este código:

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

Você usa o método BasicPublish para enviar uma mensagem para essa fila, mas a mensagem espera que o corpo seja uma matriz de bytes:

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

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

Recebendo mensagens

Na integração de recebimento, você cria o canal de mensagens e a fila da mesma forma que para o remetente. Certifique-se de que o nome da fila corresponda ao que você criou na integração de envio. Caso contrário, você criará duas filas separadas e as mensagens não chegarão ao destino correto.

Crie um novo método EventingBasicConsumer() e registre um método para processar o evento Received:

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

O manipulador de mensagens usa um objeto BasicDeliverEventArgs para obter as propriedades da mensagem, inclusive o corpo da mensagem. Lembre-se de desserializar o corpo da mensagem:

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

Por fim, para verificar a fila de novas mensagens, chame o método BasicConsume();

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

Saiba mais