对于最新稳定版本,请使用 Spring Framework 7.0.6spring-doc.cadn.net.cn

概述

STOMP(Simple Text Oriented Messaging Protocol,简单文本定向消息协议)最初是为脚本语言(如 Ruby、Python 和 Perl)连接企业级消息代理而创建的。它旨在涵盖常用消息模式的一个最小功能子集。STOMP 可在任何可靠的双向流网络协议(如 TCP 和 WebSocket)之上使用。尽管 STOMP 是一种面向文本的协议,但其消息负载既可以是文本,也可以是二进制数据。spring-doc.cadn.net.cn

STOMP 是一种基于帧的协议,其帧结构以 HTTP 为模型。以下列表展示了 STOMP 帧的结构:spring-doc.cadn.net.cn

COMMAND
header1:value1
header2:value2

Body^@

客户端可以使用 SENDSUBSCRIBE 命令来发送消息或订阅消息,并附带一个 destination 头部,用于描述消息的内容以及应由谁接收。这实现了一种简单的发布-订阅机制,可用于通过代理(broker)向其他已连接的客户端发送消息,或向服务器发送消息以请求执行某些工作。spring-doc.cadn.net.cn

当你使用 Spring 的 STOMP 支持时,Spring WebSocket 应用程序将充当客户端的 STOMP 代理。消息会被路由到 @Controller 中的消息处理方法,或者路由到一个简单的内存代理,该代理负责跟踪订阅关系并向已订阅的用户广播消息。你还可以配置 Spring 与专用的 STOMP 代理(例如 RabbitMQ、ActiveMQ 等)协同工作,以实际执行消息的广播。在这种情况下,Spring 会维护与代理的 TCP 连接,将消息转发给代理,并将来自代理的消息传递给已连接的 WebSocket 客户端。因此,Spring Web 应用程序可以依赖统一的基于 HTTP 的安全机制、通用的验证逻辑,以及熟悉的消息处理编程模型。spring-doc.cadn.net.cn

以下示例展示了一个客户端订阅接收股票行情信息,服务器可能会定期发送这些信息(例如,通过一个调度任务,使用 SimpMessagingTemplate 向代理发送消息):spring-doc.cadn.net.cn

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

^@

以下示例展示了一个客户端发送交易请求,服务器可以通过 @MessageMapping 方法来处理该请求:spring-doc.cadn.net.cn

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

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

执行完成后,服务器可以向客户端广播交易确认消息及详细信息。spring-doc.cadn.net.cn

STOMP 规范有意未对目的地(destination)的含义做出明确界定。它可以是任意字符串,完全由 STOMP 服务器自行定义其所支持的目的地的语义和语法。然而,通常情况下,目的地采用类似路径的字符串形式,其中 /topic/.. 表示发布-订阅(一对多)模式,而 /queue/ 表示点对点(一对一)的消息交换。spring-doc.cadn.net.cn

STOMP 服务器可以使用 MESSAGE 命令向所有订阅者广播消息。 以下示例展示了一个服务器向已订阅的客户端发送股票行情:spring-doc.cadn.net.cn

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

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

服务器不能发送未经请求的消息。服务器发出的所有消息都必须是对客户端特定订阅的响应,且服务器消息中的 subscription 头必须与客户端订阅中的 id 头相匹配。spring-doc.cadn.net.cn

上述概述旨在提供对 STOMP 协议最基本的理解。我们建议完整阅读该协议的规范spring-doc.cadn.net.cn