|
对于最新的稳定版本,请使用 Spring Framework 7.0.6! |
概述
STOMP (简单文本定向消息协议) 最初是为脚本语言(如 Ruby、Python 和 Perl)连接到企业消息代理而创建的。它旨在解决常用消息模式的一个最小子集。STOMP 可以通过任何可靠的双向流网络协议使用,例如 TCP 和 WebSocket。尽管 STOMP 是一种文本定向协议,但消息负载可以是文本或二进制。
STOMP 是一种基于帧的协议,其帧的模型基于 HTTP。以下列出了 STOMP 帧的结构:
COMMAND header1:value1 header2:value2 Body^@
Clients can use the SEND or SUBSCRIBE commands to send or subscribe for
messages, along with a destination header that describes what the
message is about and who should receive it. This enables a simple
publish-subscribe mechanism that you can use to send messages through the broker
to other connected clients or to send messages to the server to request that
some work be performed.
当你使用Spring的STOMP支持时,Spring WebSocket应用程序充当客户端的STOMP代理。消息被路由到@Controller个消息处理方法或一个简单的内存中代理,该代理跟踪订阅并将消息广播给已订阅的用户。你还可以配置Spring与专用的STOMP代理(如RabbitMQ、ActiveMQ等)一起工作,用于实际的消息广播。在这种情况下,Spring维护与代理的TCP连接,将消息转发给它,并将来自它的消息传递给已连接的WebSocket客户端。因此,Spring Web应用程序可以依赖统一的基于HTTP的安全性、通用验证和熟悉的消息处理编程模型。
以下示例展示了一个客户端订阅接收股票报价,服务器可能会周期性地发出这些报价(例如,通过一个定时任务发送消息到经纪人):
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协议的基本理解。我们建议完整查看该协议的 规范。