当前位置: 首页 > 工具软件 > stomp > 使用案例 >

STOMP协议

卫梓
2023-12-01

    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命令

客户端请求示例:

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^@

客户端

SEND命令

报头必须包含destination,它指定消息的发送位置。

SEND
destination:/queue/a
content-type:text/plain

hello queue a
^@

    如果消息体有内容,报头需要包含content-length和 content-type。可以在头部添加任意自定义报头。如果服务器无法成功处理消息,则服务器必须向客户端发送ERROR命令信息。

SUBSCRIBE命令

订阅用于注册监听给定的目标。如下:

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不能导致前面的消息得到确认。

UNSUBSCRIBE命令

取消订阅框架用于删除现有订阅。一旦删除订阅,STOMP连接将不再从该目标接收消息。它要求id头与前一个SUBSCRIBE操作的id值必须相同。如下:

UNSUBSCRIBE
id:0

^@

ACK命令

ACK用于使用客户机或客户机个人确认来确认来自订阅的消息的使用。在通过ACK或NACK确认消息之前,从该订阅接收的任何消息都不会被视为已被消费。

ACK有两个必需的消息头:message-id和subscription,它必与MESSAGE的message-id和subscription相同。可以指定transaction头。

ACK
subscription:0
message-id:007
transaction:tx1

^@

NACK命令

NACK与ACK相反。它用于告诉服务器客户端没有使用消息。然后,服务器可以将消息发送到另一个客户端,丢弃它,或者将其放入死信队列。

NACK采用与ACK相同的头

BEGIN命令

开始事务使用

BEGIN
transaction:tx1

^@

COMMIT命令

事务提交

COMMIT
transaction:tx1

^@

ABORT命令

事务回滚

ABORT
transaction:tx1

^@

DISCONNECT命令

1、发送断开连接命令:

DISCONNECT
receipt:77
^@

2、回复断开连接命令

RECEIPT
receipt-id:77
^@

3、断开连接

服务端

MESSAGE命令

发送消息,如下:

MESSAGE
subscription:0
message-id:007
destination:/queue/a
content-type:text/plain

hello queue a^@

如果存在正文,则消息头应该包括content-length和content-type。

RECEIPT命令

一旦服务器成功处理了请求接收的客户端消息,则会将receipt-id发送给客户端。

RECEIPT
receipt-id:message-12345

^@

消息体为空

ERROR命令

如果出现错误,服务器可能会发送错误消息。

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.
^@
 类似资料: