概述
STOMP (Simple Text Oriented Messaging Protocol) 最初是为脚本语言(如 Ruby、Python 和 Perl)设计的,用于连接到企业级消息代理(Broker)。它旨在解决常用消息传递模式的一个最小子集。STOMP 可以运行在任何可靠的双向流式网络协议之上,如 TCP 和 WebSocket。虽然 STOMP 是面向文本的协议,但消息负载(Payload)可以是文本,也可以是二进制。
STOMP 帧结构
STOMP 是一种基于帧的协议,其帧模型参考了 HTTP。以下是 STOMP 帧的结构示例:
text
COMMAND
header1:value1
header2:value2
Body^@- SEND/SUBSCRIBE: 客户端使用这些命令发送消息或订阅消息,并带有一个
destination标头,说明消息内容以及谁应该接收。 - 发布-订阅机制: 这种简单的机制允许通过代理将消息发送给其他连接的客户端,或发送给服务器请求执行某项操作。
Spring 中的 STOMP
当你使用 Spring 的 STOMP 支持时,Spring WebSocket 应用程序充当客户端的 STOMP 代理。
- 路由: 消息被路由到
@Controller中的消息处理方法,或者路由到内存中的简单代理(记录订阅并广播消息)。 - 外部代理: 你也可以配置 Spring 与外部专业的 STOMP 代理(如 RabbitMQ, ActiveMQ 等)协同工作。
- 优势: Spring 应用程序可以依赖统一的基于 HTTP 的安全性、通用校验以及熟悉的编程模型来处理消息。
示例交互
客户端订阅股票报价:
text
SUBSCRIBE
id:sub-1
destination:/topic/price.stock.*
^@客户端发送交易请求:
text
SEND
destination:/queue/trade
content-type:application/json
content-length:44
{"action":"BUY","ticker":"MMM","shares",44}^@补充教学
1. 目的地 (Destination) 的约定
STOMP 规范特意没有规定目的地的语法,但 Spring 中通常遵循以下惯例:
/topic/..: 暗示发布-订阅(一多对),所有订阅该主题的人都能收到。/queue/..: 暗示点对点(一对一),通常用于特定的请求处理。/app/..: 通常用于发送给服务器端@MessageMapping处理的请求。
2. 帧的终止符
注意到示例中结尾的 ^@ 了吗?这是 NULL 字节(UTF-8 中的 0),表示帧的结束。这使得解析器能非常快速地检测到消息边界,即便 Body 中包含换行符。