概述
STOMP(简单文本导向消息协议)最初是为脚本语言(如 Ruby、Python 和 Perl)创建的,以连接企业消息中间件。它旨在解决一小部分常用的消息模式。STOMP 可以在任何可靠的双向流网络协议上使用,例如 TCP 和 WebSocket。尽管 STOMP 是一种面向文本的协议,但消息负载可以是文本或二进制。
STOMP 是一种基于帧的协议,其帧的结构类似于 HTTP。以下列表显示了 STOMP 帧的结构:
COMMAND
header1:value1
header2:value2
Body^@
客户端可以使用 SEND
或 SUBSCRIBE
命令发送或订阅消息,同时附带一个 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 协议的最基本理解。我们建议完整查看该协议的 规范。