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.2heart-beat:10000,10000session:session-xxxxxxxxxxxxxxxxxxxxserver:RabbitMQ/3.8.7content-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:

Dando subscribe em amq.topic

Para se inscrever em tudo

/topic/*

Para se inscrever em um tópico específico

/topic/frutas.banana

Para se inscrever em tudo de frutas

/topic/frutas.*

Dando subscribe em amq.direct

Simplesmente

nome-da-queue

Mais informações sobre o padrão STOMP de mensagens

Meu exemplo de código usando WebSTOMP
https://stackblitz.com/edit/web-stomp-tito

Documentação sobre o STOMP para RabbitMQ
https://www.rabbitmq.com/stomp

Documentação sobre as Policies do RabbitMQ
https://www.rabbitmq.com/parameters.html

Criando temp-queues com STOMP no RabbitMQ
https://medium.com/@gottfrois/temporary-queues-with-rabbitmq-using-web-stomp-e98e266d61e1

You should also read: