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