Tecnologia e desenvolvimento

Categoria: RabbitMq

Usando RabbitMq com o plugin Mass Transit no .net 5 – Parte 2

Na primeira parte deste artigo criamos um producer capaz de enviar um produto para uma fila do RabbitMq usando o Mass Transit em .NET 5. Agora, vamos criar uma segunda aplicação que será responsável por consumir os dados enviados a essa fila.

Primeiro, é necessário que já tenhamos o docker rodando na máquina com a imagem do RabbitMq, caso não tenha essas informações, clique aqui e faça essa parte.

Após isso, vamos criar uma nova aplicação no Visual Studio 2019. Ela será igual a aplicação da parte 1.

Primeiro, vamos instalar os plugins:

  • Install-Package MassTransit -Version 7.2.1
  • Install-Package MassTransit.RabbitMQ -Version 7.2.1
  • Install-Package MassTransit.AspNetCore -Version 7.2.1

No Startup, vamos criar a configuração do RabbitMq:

services.AddMassTransit(cfg =>
{
     cfg.UsingRabbitMq((context, config) =>
     {
           config.Host("localhost", "/", h =>
           {
               h.Username("guest");
               h.Password("guest");
           });
         });
});

services.AddMassTransitHostedService();

Nesse passo, configuramos apenas os dados de acesso e host do RabbitMq. Precisamos criar o Consumer, que será responsável por consumir a fila e realizar alguma ação do nosso sistema. Vamos criar agora o ProductConsumer

public class ProductConsumer : IConsumer<Product>
    {
        private readonly ILogger<ProductConsumer> _logger;

        public ProductConsumer(ILogger<ProductConsumer> logger)
        {
            _logger = logger;
        }

        public Task Consume(ConsumeContext<Product> context)
        {
            try
            {
                var product = context.Message;
                product.DateUpdatePrice = DateTime.Now;
                _logger.LogInformation($"Product received: {product.Id}");
            }
            catch (Exception ex) { _logger.LogError("Error on try to consume product", ex); }
            return Task.CompletedTask;
        }
    }

Vamos analisar o que foi feito aqui. Primeiro, a classe criada herda de IConsumer, que é uma interface do Mass Transit. Ela será responsável por falar que as mensagens da fila são do objeto Product que criamos na aplicação de consumer. Neste ponto, precisamos criar a classe de Product nessa aplicação, mas detalhe ela precisa ter o mesmo namespace do outro projeto. Porque? O mass transit envia o arquivo com o namespace completo, logo se não tivermos o mesmo valor a mensagem irá se perder no RabbitMq.

Nossa Task Consume nada mais é do que um método que recebe uma mensagem ConsumeContext que tem um product enviado pelo Producer. Dentro do método podemos implementar nossa lógica de negócio, seja ela chamando outra aplicação ou até mesmo realizando um update no banco, fica a seu critério.

Após criar o nosso Consumer, precisamos voltar no Startup para inserir esse consumer no nosso ambiente:

 services.AddMassTransit(cfg =>
            {
                cfg.AddConsumer<ProductConsumer>();
                cfg.UsingRabbitMq((context, config) =>
                {
                    config.ReceiveEndpoint("product_queue", e =>
                    {
                        e.ConfigureConsumer<ProductConsumer>(context);
                    });

                    config.Host("localhost", "/", h =>
                    {
                        h.Username("guest");
                        h.Password("guest");
                    });
                });
});

Repare que criamos uma nova chamada para AddConsumer, informando nossa classe recém criada. Além disso, informamos o nome do Endpoint que está recebendo os dados e chamamos a classe de Consumer recebendo o context, que são as mensagens da Fila.

Pronto, temos nosso consumer pronto para receber os dados em tempo real. Essa solução atende a necessidade de criar um método assíncrono onde o usuário recebe algum produto, crédito ou até mesmo compra depois de um tempo.

Código completo no github: wenderdalber/MassTransit-RabbitMq-Consumer: A sample consumer queue RabbitMq using mass transit (github.com)

Usando RabbitMq com o plugin Mass Transit no .net 5 – Parte 1

Neste tutorial vamos criar uma aplicação em .net 5 que irá realizar o envio de um produto para uma fila no RabbitMq. Para isso, iremos utilizar um plugin chamado Mass Transit, que será capaz de enviar para o endpoint da fila os dados.

Ferramentas utilizadas:

  • Docker
  • RabbitMq
  • Visual Studio 2019
  • .Net 5

Primeiro, precisamos ter configurado em nossa máquina o docker. Caso você não tenha, clique neste link e acesse um tutorial completo sobre como configurar o mesmo.

Após esse processo, iremos criar um arquivo de docker-compose, que será responsável pela criação da nossa imagem do RabbitMq:

version: "3.2"
services:
  rabbitmq:
    image: rabbitmq:3-management-alpine
    container_name: 'rabbitmq'
    ports:
        - 5672:5672
        - 15672:15672
    volumes:
        - ~/.docker-conf/rabbitmq/data/:/var/lib/rabbitmq/
        - ~/.docker-conf/rabbitmq/log/:/var/log/rabbitmq
    networks:
        - rabbitmq_go_net

networks:
  rabbitmq_go_net:
    driver: bridge

Vamos salvar esse arquivo com o nome e a seguinte extensão: docker-compose.yml

Agora iremos abrir o Visual Studio 2019, é importante já ter configurado e instalado o .NET 5 na sua máquina, caso não tenha clique neste link e acesse um tutorial sobre como configurar o ambiente.

Com o Visual Studio aberto, vamos criar um novo projeto:

clique em Create a new project

Após esse processo, vamos selecionar o tipo de projeto:

Selecione o tipo ASP NET.Core Web Application

Vamos inserir o nome da nossa aplicação:

Definindo o nome do projeto

Selecionar a versão do .NET 5 e o tipo Web API:

Selecione a versão do .NET 5 e o tipo de aplicação

Após esse processo, vamos criar a classe de produto que será a nossa base de desenvolvimento:

    public class Product
    {
        public int Id { get;set; }
        public string Name { get; set; }
        public decimal Price { get; set; }
        public DateTime DateUpdatePrice { get; set; }
    }

Neste momento, vamos instalar os pacotes do Mass Transit necessários para o desenvolvimento:

  • Install-Package MassTransit -Version 7.2.1
  • Install-Package MassTransit.RabbitMQ -Version 7.2.1
  • Install-Package MassTransit.AspNetCore -Version 7.2.1

Vamos configurar dentro do Startup o nosso ambiente do RabbitMq:

services.AddMassTransit(cfg =>
            {
                cfg.UsingRabbitMq((context, config) =>
                {
                    config.ReceiveEndpoint("product_queue", e => { });
                    config.Host("localhost", "/", h =>
                    {
                        h.Username("guest");
                        h.Password("guest");
                    });
                });
            });

            services.AddMassTransitHostedService();

Repare que estamos utilizando o services, que já existe dentro do ambiente de ConfigureServices da nossa classe Startup padrão. Nele, estamos falando que o endpoint que será utilizado é o product_queue e também estamos informando qual o host, username e password do RabbitMq iremos utilizar. Por último, estamos instanciando o AssMassTransitHostedService.

Iremos criar nossa Controller de Product, primeiro vamos realizar a instanciação de duas classes no construtor:

 private readonly ILogger<ProductController> _logger;
 private readonly IBusControl _bus;

        public ProductController(ILogger<ProductController> logger, IBusControl bus)
        {
            _logger = logger;
            _bus = bus;
        }

IBusControl é um componente do Mass Transit, será com ele que iremos realizar o Publish do nosso objeto para a fila. O ILogger é uma classe padrão que existe desde o aspnetcore 2.1 que nos ajuda a criar log do que aconteceu no nosso código. Iremos agora criar nossa Task:

[HttpPost]
public async Task<IActionResult> Post([FromBody] Product product)
{
            await _bus.Publish<Product>(new Product { Id = product.Id, Name = product.Name, Price = product.Price });
            var message = $"Message received. ProductId: { product.Id } in { DateTime.Now }";
            _logger.LogInformation(message);
            return Ok(message);
}

Recebemos o produto no body da chamada e realizamos então o envio par a fila, chamando o _bus do Mass Transit. Pronto, já temos nosso objeto na fila do RabbitMQ. No próximo post iremos realizar a configuração do Consumer, que irá consumir essa fila de tempos em tempos.

Para ter acesso ao código fonte desse tutorial: MassTransit-RabbitMq-Producer/MassTransit-RabbitMq-Producer at main · wenderdalber/MassTransit-RabbitMq-Producer (github.com)

Parte 2

© 2025 Wender Dalber

Theme by Anders NorenUp ↑