概述

STOMP (简单文本定向消息协议) 最初是为脚本语言(如 Ruby、Python 和 Perl)连接到企业消息代理而创建的。它旨在解决常用消息模式的最小子集。STOMP 可用于任何可靠的双向流式网络协议,例如 TCP 和 WebSocket。尽管 STOMP 是面向文本的协议,但消息有效负载可以是文本或二进制数据。

STOMP 是一种基于帧的协议,其帧是根据 HTTP 建模的。下面的列表显示了 STOMP 帧的结构。

COMMAND
header1:value1
header2:value2

Body^@

客户端可以使用SENDSUBSCRIBE命令发送或订阅消息,以及描述消息内容和谁应该接收消息的destination标头。这启用了一个简单的发布-订阅机制,您可以使用它通过代理向其他连接的客户端发送消息,或向服务器发送消息以请求执行某些工作。

当您使用 Spring 的 STOMP 支持时,Spring WebSocket 应用程序充当客户端的 STOMP 代理。消息被路由到@Controller消息处理方法或简单的内存中代理,该代理跟踪订阅并向已订阅的用户广播消息。您还可以配置 Spring 以使用专用的 STOMP 代理(例如 RabbitMQ、ActiveMQ 等)来实际广播消息。在这种情况下,Spring 保持与代理的 TCP 连接,将消息转发给它,并将消息从它传递到连接的 WebSocket 客户端。因此,Spring Web 应用程序可以依赖统一的基于 HTTP 的安全性、通用验证和熟悉的编程模型来处理消息。

以下示例显示一个客户端订阅接收股票报价,服务器可能会定期发出这些报价(例如,通过一个计划任务,该任务通过SimpMessagingTemplate向代理发送消息)。

SUBSCRIBE
id:sub-1
destination:/topic/price.stock.*

^@

以下示例显示一个客户端发送交易请求,服务器可以通过@MessageMapping方法处理该请求。

SEND
destination:/queue/trade
content-type:application/json
content-length:44

{"action":"BUY","ticker":"MMM","shares",44}^@

执行后,服务器可以将交易确认消息和详细信息广播到客户端。

目的地的含义在 STOMP 规范中故意留为空白。它可以是任何字符串,完全由 STOMP 服务器定义其支持的目的地的语义和语法。但是,目的地通常是路径状字符串,其中/topic/..表示发布-订阅(一对多),/queue/表示点对点(一对一)消息交换。

STOMP 服务器可以使用MESSAGE命令向所有订阅者广播消息。以下示例显示服务器向已订阅的客户端发送股票报价。

MESSAGE
message-id:nxahklf6-1
subscription:sub-1
destination:/topic/price.stock.MMM

{"ticker":"MMM","price":129.45}^@

服务器不能发送主动消息。来自服务器的所有消息都必须是对特定客户端订阅的响应,并且服务器消息的subscription标头必须与客户端订阅的id标头匹配。

以上概述旨在提供对 STOMP 协议的最基本理解。我们建议您完整阅读该协议规范