STOMP (Simple Text Oriented Messaging Protocol)最初是为脚本语言(如 Ruby、Python 和 Perl)创建的,用于连接到企业消息代理。它被设计用来解决常用信息传递模式的一个最小子集。STOMP 可以通过任何可靠的双向流媒体网络协议使用,如 TCP 和 WebSocket。尽管 STOMP 是一个面向文本的协议,但消息有效载荷可以是文本或二进制。
STOMP 是一个基于框架的协议,其框架是以 HTTP 为模型的。下面列出了 STOMP 框架的结构:
COMMAND
header1:value1
header2:value2
Body^@
客户端可以使用 SEND 或 SUBSCRIBE 命令来发送或订阅消息,以及描述消息内容和谁应该收到它的目标头。这就实现了一个简单的 发布-订阅机制,你可以用它来通过经纪人向其他连接的客户端发送消息,或者向服务器发送消息以请求执行某些工作。
当你使用 Spring 的 STOMP 支持时,Spring WebSocket 应用程序充当客户的 STOMP 代理。消息被路由到 @Controller
消息处理方法或一个简单的内存代理,该代理跟踪订阅并向订阅用户广播消息。你也可以将 Spring 配置为与专门的 STOMP 代理(如 RabbitMQ、ActiveMQ 等)合作,进行消息的实际广播。在这种情况下,Spring 维护与代理的 TCP 连接,向其转发消息,并将消息从它那里传递给连接的 WebSocket 客户端。因此,Spring 网络应用可以依靠统一的基于 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 规范中,目的地(destination)的含义是故意不透明的。它可以是任何字符串,完全由 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 标头必须与客户订阅的 id 标头一致。
前面的概述是为了提供对 STOMP 协议最基本的理解。我们建议 查阅协议的全部规范。