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)
Deixe um comentário