Mensageria com RabbitMQ e ASP.NET Core – Parte #2

Neste artigo vou falar sobre como integrar sua aplicação com o serviço de mensageria RabbitMQ, e consumir mensagens dele.

Essa é a parte 2 dessa série de artigos, e você pode encontrar a parte 1 logo abaixo.

O cenário de exemplo apresentado é de uma API que receberá dados de entrada sobre uma mensagem instantänea de usuário em uma rede social, e a aplicação então publicará esses dados em uma mensagem para uma fila do RabbitMQ. Essa mensagem então será consumida, e será mostrado um exemplo o que pode ser feito com ela.

Código fonte aqui.


Quer ser notificado sobre os próximos artigos, lives semanais, eventos e treinamentos? Entre no canal LuisDev no Telegram!


Consumindo uma mensagem

Vou seguir alguns passos para poder implementar o consumo de mensagens, descrito abaixo ao longo do artigo.

Criando um BackgroundService

O primeiro passo é criar um BackgroundService. Ele será um serviço que vai rodar assim que a aplicação for iniciada, e será o responsável por “escutar” por novas mensagens da fila do RabbitMQ.

Essa classe herda da classe abstrata BackgroundService, e deverá implementar o método ExecuteAsync. É nele que estará o código de consumo da mensagem, onde código será registrado no evento de recebimento de mensagem.

Classe ProcessMessageConsumer que será utilizada para consumo de mensagens

É importante não esquecer de adicionar o ProcessMessageConsumer como um HostedService lá no método ConfigureServices da classe Startup.

Configurando a classe responsável pelo consumo de mensagens como um HostedService

Configurando a conexão com o RabbitMQ

Feito isso, vamos realizar a configuração de conexão com o RabbitMQ. O primeiro passo será adicionar no appsettings.json os dados de configuração do RabbitMQ utilizando o padrão Option. Com isso, configurar ele fica mais legível por se utilizar objetos de classes ao invés de cadeias de caracteres.

Dados de RabbitMQ no arquivo appsettings.json

Em seguida, criamos uma classe que represente os dados de configuração. Deixei as propriedades de Username e Password para caso você os utilize em seu projeto, mas comentados.

Classe utilizada para os dados de configuração do RabbitMQ

Finalmente, configuramos na classe Startup, no método ConfigureServices, a adição dessa configuração na injeção de dependência do ASP.NET Core.

Configuração do RabbitMqConfiguration para ser utilizado em outras partes do sistema via injeção de dependência

Implementando o consumo das mensagens

No construtor da classe ProcessMessageConsumer realizamos a conexão com o serviço do RabbitMQ, criação do e declaramos a fila a ser utilizada (o que criará a fila caso ela nao exista ainda).

Configuração da conexão na classe que vai consumir as mensagens

Agora, o que resta é implementar o método ExecuteAsync. A implementação utilizada para começar a “monitorar” a fila, e consumir as mensagens sob demanda, está logo abaixo. Em seguida, descrevo as ações realizadas nela.

Implementação do método ExecuteAsync, do BackgroundService definido

Nessa implementação, é feito:

  1. Definição de um objeto de tipo EventingBasicConsumer, que será responsável pela configuração dos eventos relacionados ao consumo, e pelo início efetivo deles.
  2. Definição do evento Received, onde se tem acesso à mensagem recebida na fila a ser especificada, através da propriedade eventArgs.Body
    1. Conversão dos dados contidos em eventArgs.Body, que são do tipo ReadOnlyMemory<byte>, para Array, sendo convertido em seguida para string ,e finalmente deserializado em objeto de tipo MessageInputModel
    2. Realização do Ack, que reconhece a mensagem como entregue
  3. Início do consumo, utilizando como parâmetros a fila especificada na configuração, o reconhecimento automático de entrega (autoAck) como falso, e o objeto consumer de tipo EventingBasicConsumer

Deixando o exemplo mais interessante

Como o cenário é para ser mais realista, eu adiciono logo abaixo um exemplo de como se poderia utilizar uma interface para envio de notificações, o que seria adequado para um cenário de mensageria como está seno demonstrado.

Classe completa, utilizando um serviço de notificação de exemplo

Testando

Para testar:

  1. Inserir um ponto de interrupção dentro do bloco do método que trata do evento Received
  2. Executar a aplicação
  3. Enviar uma mensagem através da API api/Messages
  4. Acompanhar a conversão dos bytes do objeto recebido, até o reconhecimento da mensagem!
  5. Comemorar.
Debugging do processamento de mensagem recebida do RabbitMQ

Inscreva-se na lista de espera do Método .NET Direto ao Ponto, um treinamento completo sobre C#, APIs com ASP.NET Core e Microsserviços:  Inscreva-se aqui.

São quase 200 vídeo-aulas sobre temas como C#, ASP NET Core 5, EF Core, CQRS, Clean Architecture, Autenticação e autorização com JWT, Testes Unitários, além de mini-cursos em Microsserviços, Performance em .NET, ASP NET Core e Azure, Docker, Carreira Internacional em .NET, e mais.


Nesse artigo foi mostrada a implementação de uma classe que realiza o consumo de mensagens do RabbitMQ, em uma aplicação ASP.NET Core. Além disso, foi mostrado como se poderia ter acesso a outros serviços, permitindo um cenário mais realista e aplicável em diversos projetos.

Se gostou, compartilhe! Até o próximo artigo.