概述
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 协议的最基本理解。我们建议您全面查看协议规范。