STOMP协议
📽️

STOMP协议

Created
Aug 8, 2021 12:25 PM
Tags
协议

STOMP协议规范中文版

STOMP 协议规范 - 1.2 版
STOMP 是一种简单的互操作协议,旨在通过中介服务器在客户端之间传递异步消息。 它为在这些客户端与服务端之间传递的消息定义了基于文本的连接格式。 STOMP 已活跃使用多年,并得到许多消息代理与客户端库的支持。 本规范定义了 STOMP 1.2 协议,并且是 STOMP 1.1 的更新。 请将反馈发送到 stomp-spec@googlegroups.com 邮件列表。 STOMP 源于需要通过脚本语言(例如:Ruby、Python 与 Perl)连接到企业消息代理的需求。 在这种环境中,通常会执行逻辑上简单的操作, 例如"可靠地发送单个消息并断开连接"或"消费给定目的地上的所有消息"。 它是其他开放消息协议(例如:AMQP)与 JMS 代理(例如:OpenWire)中使用的实现特定连接协议的替代。 它的独特之处是只涵盖了一小部分常用的消息传递操作,而不是提供一个全面的消息传递 API。 最近,STOMP 已经发展成为一种协议,就其现在提供的线路级特性而言, 可以通过这些简单的用例使用,但仍保持其简单性和互操作性的核心设计原则。 STOMP 是基于帧的协议,其帧以 HTTP 为模型。 框架由命令,一组可选的标头与可选的正文组成。 STOMP 基于文本,但也允许传输二进制消息。 STOMP 的默认编码为 UTF-8,但是支持消息体的替代编码规范。 STOMP 服务端被建模为一组可以向其发送消息的目标。 STOMP 协议将目标视为不透明字符串,并且其语法是服务端实现特定的。 此外,STOMP 并未定义目的地的传递语义。 目的地的传递或"消息交换"的语义可能因服务端而异,甚至因目的地而异。 这使服务端可以利用 STOMP 支持的语义进行创新。 STOMP

相关参考

个人理解

与spring-messaging整合之后, 网上有些容易混淆的点, 在亲自验证之后, 记录一下个人理解.
  1. registry.enableSimpleBroker("xxx") 方法的参数是设置广播节点, 只有节点暴露之后才有效. 给用户单独发消息的 /user 前缀可以不用添加
2. 订阅/user 开头的的写法网上有两种: stompClient.subscribe('/user/chat', function (data) {xxx})
stompClient.subscribe('/user/' + uid + '/chat', function (data) {xxx})
第一种订阅方法订阅之后, 会使用 DefaultUserDestinationResolver.getTargetDestination()方法来
得到一个与session绑定的唯一地址, 然后注册到DefaultSubscriptionRegistry里面, 实际上的订阅地
址是: /chat-userxxx
在发送一对一消息时, 调用sendToUser()方法会先拼接成 /user/uid/chat 这个dest, 然后根据这个地
址查询到真正的topic: /chat-userxxx 来发送消息
第二种订阅方法, 也可以实现效果, 但是根据断点调试结果来看是直接往 '/user/' + uid + '/chat'
个topic上发消息的, 也就是说如果别人也订阅了这个topic, 则也会收到消息(个人猜测)
总结一下, 第一种方法是往 /chat-userxxx 这个topic发消息的, 第二种是往 /user/xxx/chat 这个
topic发消息的

DEMO