STOMP (Simple Text Oriented Messaging Protocol)最初是为脚本语言(如 Ruby、Python 和 Perl)创建的,用于连接到企业消息代理。它被设计用来解决常用信息传递模式的一个最小子集。STOMP 可以通过任何可靠的双向流媒体网络协议使用,如 TCP 和 WebSocket。尽管 STOMP 是一个面向文本的协议,但消息有效载荷可以是文本或二进制。

    STOMP 是一个基于框架的协议,其框架是以 HTTP 为模型的。下面列出了 STOMP 框架的结构:

    1. COMMAND
    2. header1:value1
    3. header2:value2
    4. Body^@

    客户端可以使用 SEND 或 SUBSCRIBE 命令来发送或订阅消息,以及描述消息内容和谁应该收到它的目标头。这就实现了一个简单的 发布-订阅机制,你可以用它来通过经纪人向其他连接的客户端发送消息,或者向服务器发送消息以请求执行某些工作。

    当你使用 Spring 的 STOMP 支持时,Spring WebSocket 应用程序充当客户的 STOMP 代理。消息被路由到 @Controller消息处理方法或一个简单的内存代理,该代理跟踪订阅并向订阅用户广播消息。你也可以将 Spring 配置为与专门的 STOMP 代理(如 RabbitMQ、ActiveMQ 等)合作,进行消息的实际广播。在这种情况下,Spring 维护与代理的 TCP 连接,向其转发消息,并将消息从它那里传递给连接的 WebSocket 客户端。因此,Spring 网络应用可以依靠统一的基于 HTTP 的安全性、通用验证和熟悉的编程模型来处理消息。

    下面的例子显示了一个客户端订阅接收股票报价,服务器可能会定期发布这些报价(例如,通过一个预定任务,通过 SimpMessagingTemplate 向经纪人发送消息):

    1. SUBSCRIBE
    2. id:sub-1
    3. destination:/topic/price.stock.*
    4. ^@

    下面的例子显示了一个客户端发送了一个交易请求,服务器可以通过 @MessageMapping方法来处理:

    1. SEND
    2. destination:/queue/trade
    3. content-type:application/json
    4. content-length:44
    5. {"action":"BUY","ticker":"MMM","shares",44}^@

    执行后,服务器可以向客户广播交易确认信息和细节。

    在 STOMP 规范中,目的地(destination)的含义是故意不透明的。它可以是任何字符串,完全由 STOMP 服务器来定义它们所支持的目的地的语义和语法。然而,目的地是类似路径的字符串是非常常见的,其中 /topic/...意味着 发布-订阅(一对多)/queue/意味着 点对点(一对一)的消息交换。

    STOMP 服务器可以使用 MESSAGE 命令向所有订阅者广播消息。下面的例子显示了一个服务器向一个订阅的客户发送一个股票报价:

    1. MESSAGE
    2. message-id:nxahklf6-1
    3. subscription:sub-1
    4. destination:/topic/price.stock.MMM
    5. {"ticker":"MMM","price":129.45}^@

    一个服务器不能发送未经请求的消息。所有来自服务器的消息都必须是对特定客户订阅的响应,而且服务器消息的 subscription-id 标头必须与客户订阅的 id 标头一致。

    前面的概述是为了提供对 STOMP 协议最基本的理解。我们建议 查阅协议的全部规范