Skip to content

概述

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 代理

  1. 路由: 消息被路由到 @Controller 中的消息处理方法,或者路由到内存中的简单代理(记录订阅并广播消息)。
  2. 外部代理: 你也可以配置 Spring 与外部专业的 STOMP 代理(如 RabbitMQ, ActiveMQ 等)协同工作。
  3. 优势: 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 中包含换行符。

Based on Spring Framework.