Enviar mensagens com o RabbitMQ
É 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);