Conexão direta com amqp sem usar nenhum framework
Referência: Documentação
Requisitos:
Padrão seguindo o conceito de publisher / subscriber.
Criando o cliente
// PUBLISHER
import Express from 'express';
import { Publisher } from './lib';
const server = Express();
server.use(Express.json());
const service = Publisher.create({
exchangeName: 'exchange-01',
exchangeType: 'direct',
url: 'amqp://username:password@localhost:5672',
json: true,
});
server.post('/route01', async (req, res) => {
const result = await service.sendMessage({ content: { data: req.body }, routingKey:'route01' })
res.status(200).json({ ok: result });
});
server.post('/route02', async (req, res) => {
const result = await service.sendMessage({ content: req.body, routingKey:'route02' })
res.status(200).json({ ok: result });
});
server.listen(3000, () => console.log('running'));
Criando o microservice consumer para consumir as mensagens
// SUBSCRIBER
import { ConsumeMessage } from "amqplib";
import { Consumer, Command, Options } from "./lib";
const command1: Command = {
execute: async (data: ConsumeMessage, command: Options) => {
console.log("route01");
console.log(data.content.toString());
await command.nack(data);
}
}
const command2: Command = {
execute: async (data: ConsumeMessage, command: Options) => {
console.log("route02");
console.log(data.content.toString());
command.ack(data);
}
}
const consumer = Consumer.create({
exchangeName: 'exchange-01',
exchangeType: 'direct',
queueName: 'queue-01',
url: 'amqp://username:password@localhost:5672',
});
consumer.createChannel({
command: command1,
json: true,
prefetchCount: 60,
routingKey: 'route01',
});
consumer.createChannel({
command: command2,
json: true,
prefetchCount: 60,
routingKey: 'route02',
});
Clone o projeto e exetute os passos
- Installar as dependências
- Execute o container rabbitmq
docker-compose up -d
- Execute os dois projetos
consumer
epublisher
Enviando dados para a routing-key-01
curl --location --request POST 'http://localhost:3000/route01' \
--header 'Content-Type: application/json' \
--data-raw '{
"some": "any data to route 1"
}'
Enviando dados para a routing-key-02
curl --location --request POST 'http://localhost:3000/route02' \
--header 'Content-Type: application/json' \
--data-raw '{
"some": "any data to route 2"
}'