概述
STOMP(Simple Text Oriented Messaging Protocol)最初是为脚本语言(如Ruby、Python和Perl)连接企业消息代理而创建的。它旨在解决常用消息模式的最小子集。STOMP可以在任何可靠的双向流网络协议上使用,如TCP和WebSocket。尽管STOMP是一种面向文本的协议,但消息有效载荷可以是文本或二进制。
STOMP是基于帧的协议,其帧的模型基于HTTP。以下列表显示了STOMP帧的结构:
COMMAND header1:value1 header2:value2 Body^@
客户端可以使用SEND
或SUBSCRIBE
命令发送或订阅消息,同时使用描述消息内容和接收者的destination
头。这使得可以使用简单的发布-订阅机制将消息通过代理发送到其他连接的客户端,或者向服务器发送消息以请求执行某些工作。
当您使用Spring的STOMP支持时,Spring WebSocket应用程序充当客户端的STOMP代理。消息被路由到@Controller
消息处理方法或一个简单的内存代理,用于跟踪订阅并向订阅用户广播消息。您还可以配置Spring与专用的STOMP代理(如RabbitMQ、ActiveMQ等)一起工作,用于实际广播消息。在这种情况下,Spring维护与代理的TCP连接,将消息中继到代理,并将消息从代理传递给连接的WebSocket客户端。因此,Spring Web应用程序可以依赖统一的基于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规范中被故意保持不透明。它可以是任何字符串,完全由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协议的最基本理解。我们建议全面审查协议规范。