ASP.NET Core - Usando RabbitMQ - II
 Neste artigo vamos continuar a criar a aplicação que o RabbitMQ em uma aplicação Asp.NET Core Web API.


Continuando o artigo anterior vamos incluir uma aplicação console no projeto criado.

 


 

Criando o projeto Console

 

Com o projeto Web API aberto no VS 2022 selecione a opção File -> Add -> New Project , selecionando o template ConsoleApp e informando o nome ApiRabbitMQ.ConsoleApp.


Vamos deixar desmarcada a opção : Do not use top-level statements.

 

Inclua no projeto console uma referência ao pacote RabbitMQ.Client.

 

A seguir na classe Program vamos incluir o código abaixo:

 

using RabbitMQ.Client;
using RabbitMQ.Client.Events;

using System.Text;

//Definição do servidor Rabbit MQ : usamos uma imagem Docker
var factory = new ConnectionFactory
{
    HostName = "localhost"
};

//Cria uma conexão RabbitMQ usando uma factory
var connection = factory.CreateConnection();

//Cria um channel com sessão e model
using var channel = connection.CreateModel();

//declara a fila(queue) a seguir o nome e propriedades
channel.QueueDeclare("product", exclusive: false);

//Define o objeto Event o qual vai ouvir a mensagem do channel enviado pelo producer
var consumer = new EventingBasicConsumer(channel);

consumer.Received += (model, eventArgs) =>
{
    var body = eventArgs.Body.ToArray();
    var message = Encoding.UTF8.GetString(body);
    Console.WriteLine($"Product message received: {message}");
};

//le a mensagem
channel.BasicConsume(queue: "product", autoAck: true, consumer: consumer);

Console.ReadKey();

 

Aqui definimos o código que vai receber ler a fila de mensagens enviadas pela aplicação Web API.

 

Criando o container do RabbitMQ

 

Agora precisamos do RabbitMQ e ao invés de fazer a instalação em nossa máquina local vamos usar a imagem oficial :

 rabbitmq:3-management

 

Para baixar a imagem usamos o comando do Docker : docker pull rabbitmq:3-management

 

Com a imagem baixada localmente vamos levantar um container docker usando esta imagem:

 

docker run --rm  -it -p 15672:15672 -p 5672:5672 rabbitmq:3-management

 

 

Este comando criar um container no modo iterativo mapeando a porta 5672 para a porta 15672 no host local.

 

Podemos agora acessar o RabbitMQ abrindo o navegador no endereço : http://localhost:15672/

 

 

Para acessar usamos o username guest e password guest.

 

 

Acima estamos exibindo a visão das filas ou Queues e até o momento não temos uma fila criada. Após acionar a aplicação Web API iremos criar a fila - product.

 

Agora podemos configurar o nosso projeto para abrir os projetos Web API e Console na inicilização definindo a opção Multiple startup projects :

 

 

Depois disso vamos executar o projeto e acionar o endpoint api/products/addproduct e vamos incluir alguns produtos apenas para testar:
 

 

Vamos clicar algumas vezes o botão Execute para simular a inclusão de alguns produtos.

 

Após isso vamos abrir o RabbitMQ verificamos que a fila product foi criada:

 


 

Expandindo a fila product e clicando em GetMessages veremos o gráfico representando o pico das mensagens que enviamos :

 

 

No projeto console temos as mensagens lidas da fila sendo exibidas conforme abaixo:

 

 

Temos assim um exemplo prático e simples do funcionamento do RabbitMQ que você pode expandir e usar de acordo com sua necessidade e propósito.

 

Note que usando uma imagem docker e criando um container nosso ambiente não precisou incluir pacotes ou referência do RabbitMQ.

 

Pegue o projeto aqui :   ApiRabbitMq.zip (sem as referências)
 

"Porque não nos chamou Deus para a imundícia, mas para a santificação"
1 Tessalonicenses 4:7

 

Porque um menino nos nasceu, um filho se nos deu, e o principado está sobre os seus ombros, e se chamará o seu nome: Maravilhoso, Conselheiro, Deus Forte, Pai da Eternidade, Príncipe da Paz.

Isaías 9:6
Porque um menino nos nasceu, um filho se nos deu, e o principado está sobre os seus ombros, e se chamará o seu nome: Maravilhoso, Conselheiro, Deus Forte, Pai da Eternidade, Príncipe da Paz.

Isaías 9:6

Referências:


José Carlos Macoratti