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.
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.
É importante não esquecer de adicionar o ProcessMessageConsumer como um HostedService lá no método ConfigureServices da classe Startup.
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.
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.
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.
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).
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.
Nessa implementação, é feito:
- 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.
- Definição do evento Received, onde se tem acesso à mensagem recebida na fila a ser especificada, através da propriedade eventArgs.Body
- Conversão dos dados contidos em eventArgs.Body, que são do tipo ReadOnlyMemory, para Array, sendo convertido em seguida para string ,e finalmente deserializado em objeto de tipo MessageInputModel
- Realização do Ack, que reconhece a mensagem como entregue
- 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.
Testando
Para testar:
- Inserir um ponto de interrupção dentro do bloco do método que trata do evento Received
- Executar a aplicação
- Enviar uma mensagem através da API api/Messages
- Acompanhar a conversão dos bytes do objeto recebido, até o reconhecimento da mensagem!
- Comemorar.
Quer alavancar sua carreira como Desenvolvedor(a) .NET?
Opa, aqui é o Luis Felipe (LuisDev), criador do blog LuisDev.
Além de Desenvolvedor .NET Sênior, eu sou instrutor de mais de 700 alunos e também tenho dezenas de mentorados.
Conheça o com mais de 800 video-aulas sobre C# e desenvolvimento de APIs com ASP NET Core, Microsserviços com ASP NET Core, Arquitetura de Software, Computação em Nuvem, SQL, HTML, CSS e JavaScript, JavaScript Intermediário, TypeScript, Desenvolvimento Front-End com Angular, e Desenvolvimento Front-end com React. Diversos mini-cursos disponíveis aos alunos e atualizações gratuitas.
Suporte dedicado, e comunidade de centenas de alunos.
Completo e online, destinado a profissionais que querem dar seu próximo passo em sua carreira como desenvolvedores .NET.
Clique aqui para ter mais informações e garantir sua vaga
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.
Dev .NET Sênior com experiências para Irlanda e Estados Unidos, 2x Microsoft MVP, 9x Microsoft Certified, MBA em Arquitetura de Soluções, Fundador e Instrutor LuisDev Treinamentos,