Usando STOMP e Web STOMP com o RabbitMQ
O RabbitMQ tem suporte nativo para o protocolo STOMP e STOMP via WebSockets (chamado também de WebSTOMP).
O STOMP no RabbitMQ tem muitas semelhanças com o protocolo AMQP, com ele é possível configurar vários detalhes de criação de filas, bindings e publicação de mensagens. O STOMP é muito mais flexível e completo em comparação ao MQTT ou MQTT via WebSockets (chamado de WebMQTT).
O funcionamento do STOMP via TCP e do WebSTOMP via WebSockets é praticamente igual, o que muda é que o software do lado do cliente que será usado para se conectar. A grande vantagem do WebStomp é que é possível usar ele em websites, principalmente nos PWA (progressive web applications). É uma das tecnologias de ponta no desenvolvimento web da atualidade.
Quais são as bibliotecas de Web Stomp para JavaScript?
Discussão sobre o problema das bibliotecas de webstomp e seus abandonos:
https://stackoverflow.com/questions/41119274/stomp-js-is-out-of-date-and-no-longer-maintained-which-stomp-client-to-use-wit
A biblioteca original do jmesnil:
https://github.com/jmesnil/stomp-websocket
O primeiro fork ThoughtWire:
https://github.com/ThoughtWire/stomp-websocket
O segundo fork, chamando stomp-js (versão 3 e 4):
https://github.com/stomp-js/stomp-websocket
A última edição, chamado stomp-js (versão 5):
https://github.com/stomp-js/stompjs
Então recomendo usar o stomp-js (versão 5): https://github.com/stomp-js/stompjs
Documentação: https://stomp-js.github.io/api-docs/latest/
Página: https://stomp-js.github.io/
Tutorial rápido: https://stomp-js.github.io/guide/stompjs/using-stompjs-v5.html
No NPM: https://www.npmjs.com/package/@stomp/stompjs
Usando o STOMP
O protocolo STOMP limita as ações que podemos enviar à ele em x tipos de mensagens, chamadas de frames. São elas:
CONNECT - inicia a conexão o broker STOMP ou WebSTOMP (que no nosso caso é o RabbitMQ).
SUBSCRIBE - cria uma queue e faz bindings nela.
SEND - envia (publica) uma mensagem em uma fila ou exchange.
UNSUBSCRIBE - apaga uma binding ou apaga uma queue.
Se conectando ao RabbitMQ com o STOMP
Ao se conectar com sucesso via WebSTOMP como cliente uma mensagem do seguinte tipo é recebida:
CONNECTEDversion:1.2 heart-beat:10000,10000 session:session-xxxxxxxxxxxxxxxxxxxx server:RabbitMQ/3.8.7 content-length:0
Lidando com erros
O STOMP não é muito bom em descrever os erros que estão acontecendo.
Ao tentar me conectar com um usuário sem permissão para o vhost /, o cliente WebSTOMP me informou o seguinte erro:
{"command":"ERROR","headers":{"content-length":"30","version":"1.0,1.1,1.2","content-type":"text/plain","message":"Bad CONNECT"},"_binaryBody":{"0":86,"1":105,"2":114,"3":116,"4":117,"5":97,"6":108,"7":32,"8":104,"9":111,"10":115,"11":116,"12":32,"13":39,"14":47,"15":39,"16":32,"17":97,"18":99,"19":99,"20":101,"21":115,"22":115,"23":32,"24":100,"25":101,"26":110,"27":105,"28":101,"29":100},"isBinaryBody":true,"escapeHeaderValues":false,"skipContentLengthHeader":false}
Como criar filas e fazer bindings nelas?
Se você usa o RabbitMQ apenas com a exchange amq.topic, o jeito mais simples de usar é esse:
Para se inscrever em tudo Para se inscrever em um tópico específico Para se inscrever em tudo de frutas Simplesmente Meu exemplo de código usando WebSTOMP Documentação sobre o STOMP para RabbitMQ Documentação sobre as Policies do RabbitMQ Criando temp-queues com STOMP no RabbitMQDando subscribe em amq.topic
/topic/*
/topic/frutas.banana
/topic/frutas.*
Dando subscribe em amq.direct
nome-da-queue
Mais informações sobre o padrão STOMP de mensagens
https://stackblitz.com/edit/web-stomp-tito
https://www.rabbitmq.com/stomp
https://www.rabbitmq.com/parameters.html
https://medium.com/@gottfrois/temporary-queues-with-rabbitmq-using-web-stomp-e98e266d61e1