Benner.Messaging é uma biblioteca leve em .NET Standard para lidar com qualquer serviço de mensageria com facilidade. Benner.Messaging suporta RabbitMQ, ActiveMQ, Amazon SQS e Azure Queue. É uma biblioteca gratuita e aberta sob a licença MIT.
Branch | Estado |
---|---|
master |
Nome do pacote | .NET Framework | .NET Standard |
---|---|---|
Benner.Messaging | 4.6.1 | 2.0 |
Providenciamos uma API extremamente simples e intuitiva para envio e recebimento de mensagens para os serviços RabbitMQ, ActiveMQ, Amazon SQS e Azure Queue:
Messaging.Enqueue("nome-da-fila", "olá mundo!");
var mensagem = Messaging.Dequeue("nome-da-fila");
Sim, você entendeu certo! Você programa apenas uma vez, de modo muito simples, e utiliza o código em qualquer serviço de mensageria. Sem amarras tecnológicas, sem refatoração de código. Toda magia se baseia em configuração (de arquivo ou em código).
É importante notar que a API nasceu para funcionar de um modo específico:
- Primeiro a entrar, primeiro a sair
- Um produtor envia
- Apenas um consumidor recebe
- Se o consumo falhar no recebimento ou processamento, a mensagem retorna para a fila
- A mensagem não será perdida
As operações de enfileirar e desenfileirar foram desenhadas para assegurar que uma mensagem enviada pelo produtor chegue no receptor. Isso significa que seguimos a abordagem "Publicador confirma" e "Consumidor reconhece" em todos os serviços suportados.
Crie um novo projeto:
dotnet new console -n producer
cd producer
Adicione Benner.Messaging e abra o projeto no VSCode:
dotnet add package benner.messaging
code .
Adicione using e envie uma única mensagem para alguma fila:
using Benner.Messaging;
Messaging.Enqueue("nome-da-fila", "olá mundo!");
É isso! Execute dotnet run
e você obterá:
Messaging config not found
Você vai precisar de um arquivo messaging.config
como a seguir:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="MessagingConfigSection" type="Benner.Messaging.MessagingFileConfigSection, Benner.Messaging" />
</configSections>
<MessagingConfigSection>
<queues>
<queue name="teste" broker="RabbitMQ" />
</queues>
<brokerList default="RabbitMQ">
<broker name="RabbitMQ" type="Benner.Messaging.RabbitMQConfig, Benner.Messaging">
<add key="HostName" value="Servidor" />
<add key="UserName" value="Usuario" />
<add key="Password" value="Senha" />
</broker>
</brokerList>
</MessagingConfigSection>
</configuration>
Você pode, como alternativa, injetar a configuração a partir de código:
var config = new MessagingConfigBuilder()
.WithRabbitMQBroker("RabbitMQ", "servername", setAsDefault: true)
.Create();
Messaging.Enqueue("nome-da-fila", "olá mundo!", config);
É isso! Execute dotnet run
e você obterá:
Unable to connect to RabbitMQ server
Você precisa, nesse caso, de um RabbitMQ em funcionamento.
Vamos usar um contêiner Docker para nos ajudar. Podemos executar o seguinte comando:
docker run -d -v rabbitmq_data:/var/lib/rabbitmq -p 15672:15672 -p 15671:15671 -p 5672:5672 -p 5671:5671 rabbitmq:3.7-management
Tudo pronto! Execute dotnet run
novamente. Sem erros? Ótimo, e agora?
Em seu navegador, acesse http://servername:15672/#/queues
(usuário guest, senha guest) para gerenciar o serviço. Aqui você pode ver suas filas com suas mensagens dentro.
Crie um novo projeto:
dotnet new console -n consumer
cd consumer
Adicione Benner.Messaging e abra o projeto no VSCode:
dotnet add package benner.messaging
code .
Adicione using e receba uma mensagem da fila, sem esquecer da configuração:
using Benner.Messaging;
var config = new MessagingConfigBuilder()
.WithRabbitMQBroker("RabbitMQ", "servername", setAsDefault: true)
.Create();
var mensagem = Messaging.Dequeue("nome-da-fila", config);
Console.Write(mensagem);
É isso! Execute dotnet run
e você receberá:
olá mundo!
Mude o código do consumidor para:
using Benner.Messaging;
var config = new MessagingConfigBuilder()
.WithRabbitMQBroker("RabbitMQ", "servername", setAsDefault: true)
.Create();
using (var client = new Messaging(config))
{
client.StartListening("queue-name", (e) =>
{
// Print the message
Console.WriteLine(e.AsString);
return true;
});
// Stand-by the application so it can keep listening
Console.ReadKey();
}
Execute dotnet run
em 3 terminais diferentes e você terá 3 consumidores simultâneos.
Mude o código do produtor para:
using Benner.Messaging;
var config = new MessagingConfigBuilder()
.WithRabbitMQBroker("RabbitMQ", "servername", setAsDefault: true)
.Create();
// Create new instance of messaging
using (var client = new Messaging(config))
{
// Sending 1000 messages
for (int i = 1; i <= 1000; i++)
client.EnqueueMessage("queue-name", "hello world #" + i);
}
Execute dotnet run
e você verá o que acontece.
Veja os exemplos dos passos iniciais aqui.
Ous, veja mais detalhes aqui.