STOMP是一种简单的(或流式)面向文本的消息传递协议(Simple (or Streaming) Text Orientated Messaging Protocol.
STOMP是一个简单的可互操作协议,设计用于通过中介服务器在客户端之间异步传递消息。它为客户机和服务器之间传递的消息定义了基于文本的格式。
STOMP是一种基于帧的协议,它假设下面有一个可靠的双向流网络协议(如TCP)。客户端和服务器将使用通过流发送的STOMP帧进行通信。协议结构如下:
COMMAND
header1:value1
header2:value2
Body^@
协议以以换行符结尾的命令字符开始。命令后面是一个或多个:格式的头信息。每个报头信息都以换行符结尾。空行表示标题的结尾和正文的开头。然后,正文后面跟着空字节(0x00)。本文档中的示例将使用ASCII中的^@,control-@来表示空字节。空字节后面可以有多个换行符。有关如何解析STOMP帧的更多详细信息。所有命令和头信息都区分大小写。
命令和头用UTF-8编码。
客户端请求示例:
CONNECT
accept-version:1.0,1.1,2.0
host:stomp.github.org
^@
服务端回复示例:
CONNECTED
version:1.1
^@
服务端发生错误时回复示例:
ERROR
version:1.2,2.1
content-type:text/plain
Supported protocol versions are 1.2 2.1^@
报头必须包含destination,它指定消息的发送位置。
SEND
destination:/queue/a
content-type:text/plain
hello queue a
^@
如果消息体有内容,报头需要包含content-length和 content-type。可以在头部添加任意自定义报头。如果服务器无法成功处理消息,则服务器必须向客户端发送ERROR命令信息。
订阅用于注册监听给定的目标。如下:
SUBSCRIBE
id:0
destination:/queue/foo
ack:client
^@
如果服务器无法成功创建订阅,则服务器必须向客户端发送错误信息并断开客户端连接。
消息中必须包含一个id头,以便在STOMP连接会话中唯一标识订阅。
ack头的有效值是auto、client或client-individual。如果未设置标题,则默认为“auto”。当ack为auto时,客户端不需要为接收到的消息发送服务器ack消息。服务器在将消息发送给客户机时将假定客户机已收到该消息。此确认模式可导致发送到客户端丢失消息。当ack为client时,客户端向服务器发送ack消息。如果在客户端发送ACK消息之前连接失败,服务器将假定消息未被处理,并可能将消息重新传递给另一个客户端。客户端发送的ACK消息将被视为累积回复。当ack为client-individual时,ack的操作与client-ack相同,只是客户端发送的ack或NACK消息不是累积的。这意味着后面消息的ACK或NACK不能导致前面的消息得到确认。
取消订阅框架用于删除现有订阅。一旦删除订阅,STOMP连接将不再从该目标接收消息。它要求id头与前一个SUBSCRIBE操作的id值必须相同。如下:
UNSUBSCRIBE
id:0
^@
ACK用于使用客户机或客户机个人确认来确认来自订阅的消息的使用。在通过ACK或NACK确认消息之前,从该订阅接收的任何消息都不会被视为已被消费。
ACK有两个必需的消息头:message-id和subscription,它必与MESSAGE的message-id和subscription相同。可以指定transaction头。
ACK
subscription:0
message-id:007
transaction:tx1
^@
NACK与ACK相反。它用于告诉服务器客户端没有使用消息。然后,服务器可以将消息发送到另一个客户端,丢弃它,或者将其放入死信队列。
NACK采用与ACK相同的头
开始事务使用
BEGIN
transaction:tx1
^@
事务提交
COMMIT
transaction:tx1
^@
事务回滚
ABORT
transaction:tx1
^@
1、发送断开连接命令:
DISCONNECT
receipt:77
^@
2、回复断开连接命令
RECEIPT
receipt-id:77
^@
3、断开连接
发送消息,如下:
MESSAGE
subscription:0
message-id:007
destination:/queue/a
content-type:text/plain
hello queue a^@
如果存在正文,则消息头应该包括content-length和content-type。
一旦服务器成功处理了请求接收的客户端消息,则会将receipt-id发送给客户端。
RECEIPT
receipt-id:message-12345
^@
消息体为空
如果出现错误,服务器可能会发送错误消息。
ERROR
receipt-id:message-12345
content-type:text/plain
content-length:171
message: malformed frame received
The message:
-----
MESSAGE
destined:/queue/a
receipt:message-12345
Hello queue a!
-----
Did not contain a destination header, which is REQUIRED
for message propagation.
^@