Em arquiteturas modernas orientadas a eventos, o uso de mensageria assíncrona é uma prática essencial. Uma das soluções mais conhecidas é o Apache ActiveMQ, um broker de mensagens robusto, open-source e com suporte ao protocolo JMS.
Neste artigo, você aprenderá como configurar e consumir mensagens do ActiveMQ com aplicações .NET modernas, utilizando a biblioteca Apache.NMS.ActiveMQ
.
🧱 Por que usar o ActiveMQ?
- Suporte a diversos protocolos: OpenWire, STOMP, MQTT, AMQP
- Alta disponibilidade e confiabilidade
- Gerenciamento via Web Console
- Ideal para ambientes legados e também modernos
🧰 Tecnologias Utilizadas
- .NET 8 (Console App)
- Apache ActiveMQ 5.x (Docker)
- Apache.NMS.ActiveMQ (NuGet)
- Docker Compose
🐳 Subindo o ActiveMQ com Docker
Crie um arquivo docker-compose.yml
:
version: '3.8'
services:
activemq:
image: rmohr/activemq:5.18.3
container_name: activemq
ports:
- "61616:61616" # TCP (OpenWire)
- "8161:8161" # Web UI
environment:
ACTIVEMQ_ADMIN_LOGIN: admin
ACTIVEMQ_ADMIN_PASSWORD: admin
Suba com:
docker-compose up -d
🧪 Acessando o Painel Web
Acesse:
📍 http://localhost:8161
Usuário: admin
Senha: admin
⚙️ Instalando a Biblioteca no .NET
Crie o projeto:
dotnet new console -n ActiveMqExample
cd ActiveMqExample
Adicione o pacote:
dotnet add package Apache.NMS.ActiveMQ
✉️ Enviando Mensagens
using Apache.NMS;
using Apache.NMS.ActiveMQ;
var factory = new ConnectionFactory("tcp://localhost:61616");
using var connection = factory.CreateConnection();
connection.Start();
using var session = connection.CreateSession();
IDestination destination = session.GetQueue("demo.queue");
using var producer = session.CreateProducer(destination);
var message = session.CreateTextMessage("Olá, ActiveMQ!");
producer.Send(message);
Console.WriteLine("Mensagem enviada com sucesso!");
📥 Consumindo Mensagens
using Apache.NMS;
using Apache.NMS.ActiveMQ;
var factory = new ConnectionFactory("tcp://localhost:61616");
using var connection = factory.CreateConnection();
connection.Start();
using var session = connection.CreateSession();
IDestination destination = session.GetQueue("demo.queue");
using var consumer = session.CreateConsumer(destination);
var message = consumer.Receive(TimeSpan.FromSeconds(10)) as ITextMessage;
if (message != null)
{
Console.WriteLine($"Mensagem recebida: {message.Text}");
}
else
{
Console.WriteLine("Nenhuma mensagem recebida.");
}
🛠 Boas Práticas
- Crie projetos separados para produtores e consumidores
- Utilize
ReceiveAsync
com listener para alta performance - Trate reconexões automáticas
- Use transações ou acknowledgments quando necessário
🧠 Quando Usar ActiveMQ?
Caso de Uso | Recomendado? |
---|---|
Integração de sistemas legados (Java) | ✅ Sim |
Sistemas com comunicação via JMS | ✅ Sim |
Alternativa moderna (Rabbit/Kafka) | ⚠️ Depende |
Alta taxa de mensagens e streaming | ❌ Prefira Kafka |
🤝 Conecte-se Comigo
Estou sempre aberto a trocar ideias sobre arquitetura, mensageria, .NET e sistemas distribuídos. Vamos nos conectar:
- 💻 Dev.to
- ✍️ Medium
- 📬 contato@dopme.io
Hey everyone! We’re launching free tokens for all verified Dev.to authors.
Connect your wallet
to see if you qualify (instant distribution)