3.5. 使用带有网络连接的 STOMP
STOMP 是一个基于文本的识别线协议,允许 STOMP 客户端与 STOMP Broker 通信。代理支持 STOMP 1.0、1.1 和 1.2。STOMP 客户端适用于多种语言和平台,使其成为可互操作性的良好选择。
流程
-
打开 &
lt;broker_instance_dir> /etc/broker.xml
配置文件。 -
配置现有的
接收器
或创建新接收器,并包含一个protocol
参数,其值为STOMP
,如下所示。
<acceptors> <acceptor name="stomp-acceptor">tcp://localhost:61613?protocols=STOMP</acceptor> ... </acceptors>
在上例中,代理接受端口 61613
上的 STOMP 连接,这是默认值。
有关使用 STOMP 配置代理的示例,请参阅 <install_dir>/examples/protocols
下的 stomp
示例。
3.5.1. STOMP 限制
使用 STOMP 时,会有以下限制:
-
代理目前不支持虚拟主机,这意味着
CONNECT
帧中的host
标头被忽略。 -
消息确认不是事务。
ACK
帧不能是事务的一部分,如果设置了事务
标头,它将会被忽略。
3.5.2. 为 STOMP 信息提供 ID
当通过 JMS 使用者或 QueueBrowser 接收 STOMP 消息时,消息不包含任何 JMS 属性,例如 JMSMessageID
。但是,您可以使用代理 paramater 在每个传入的 STOMP 消息上设置消息 ID。
流程
-
打开 &
lt;broker_instance_dir> /etc/broker.xml
配置文件。 -
对于用于 STOMP 连接的
acceptor
,将stompEnableMessageId
参数设置为true
,如下例所示:
<acceptors> <acceptor name="stomp-acceptor">tcp://localhost:61613?protocols=STOMP;stompEnableMessageId=true</acceptor> ... </acceptors>
通过使用 stompEnableMessageId
参数,使用此接受器发送的每个 stomp 消息都会添加额外属性。属性键是 amq-message-id
,值是前缀为 "STOMP" 的内部消息 ID 的 String 表示,如下例所示:
amq-message-id : STOMP12345
如果在配置中没有指定 stompEnableMessageId
,则默认值为 false
。
3.5.3. 将连接时间设置为实时
STOMP 客户端必须在关闭连接前发送 DISCONNECT
帧。这允许代理关闭任何服务器端资源,如会话和消费者。但是,如果 STOMP 客户端在不发送 DISCONNECT 帧的情况下退出,或者如果它们失败,代理将无法立即知道客户端是否仍处于活动状态。因此,STOMP 连接配置为将 "Time to Live"(TTL)配置为 1 分钟。这意味着,如果代理闲置超过 1 分钟,代理会停止与 STOMP 客户端的连接。
流程
-
打开 &
lt;broker_instance_dir> /etc/broker.xml
配置文件。 -
将
connectionTTL
参数添加到用于 STOMP 连接的acceptor
的 URI,如下例所示:
<acceptors> <acceptor name="stomp-acceptor">tcp://localhost:61613?protocols=STOMP;connectionTTL=20000</acceptor> ... </acceptors>
在前面的示例中,任何使用 stomp-acceptor
的 stomp 连接都将其 TTL 设置为 20 秒。
STOMP 协议的版本 1.0 不包含任何心跳帧。因此,用户责任确保在 connection-ttl 中发送数据,或者代理会假定客户端已死机并清理服务器端资源。对于版本 1.1,您可以使用 Core-beats 来维护 stomp 连接的生命周期。
将代理默认时间覆盖到实时
如前所述,STOMP 连接的默认 TTL 为一分钟。您可以通过在代理配置中添加 connection-ttl-override
属性来覆盖这个值。
流程
-
打开 &
lt;broker_instance_dir> /etc/broker.xml
配置文件。 -
添加
connection-ttl-override
属性,为新默认值提供值(毫秒)。它属于 <core>
; 小节,如下所示。
<configuration ...> ... <core ...> ... <connection-ttl-override>30000</connection-ttl-override> ... </core> <configuration>
在前面的示例中,STOMP 连接的默认生存时间(TTL)被设置为 30 秒,30000
毫秒。
3.5.4. 从 JMS 发送和接收 STOMP 消息
STOMP 主要是一个基于文本的协议。为了便于与 JMS 互操作,STOMP 实现检查是否存在 内容长度
的标头,以确定如何将 STOMP 消息映射到 JMS。
如果您希望 STOMP 消息映射到 … | 消息 should…. |
---|---|
JMS TextMessage |
不包括 |
JMS BytesMessage |
包括一个 |
将 JMS 消息映射到 STOMP 时相同的逻辑。STOMP 客户端可以确认是否存在 内容长度
标头,以确定消息正文类型(字符串或字节数)。
有关消息标头的更多信息,请参阅 STOMP 规格。
3.5.5. 将 STOMP 目的地映射到 AMQ Broker 地址和队列
在发送消息和订阅时,STOMP 客户端通常包含一个目标 标头
。目的地名称是字符串值,它们映射到代理上的目的地。在 AMQ Broker 中,这些目的地映射到 addresses 和 queues。有关目的地帧的更多信息,请参阅 STOMP 规格。
使用发送以下消息的 STOMP 客户端(headers 和正文包括):
SEND destination:/my/stomp/queue hello queue a ^@
在这种情况下,代理会将消息转发到与地址 /my/stomp/queue
相关联的任何队列。
例如,当 STOMP 客户端发送一条信息(使用 SEND
帧)时,指定的目的地被映射到地址。
当客户端发送 SUBSCRIBE
或 UNSUBSCRIBE
帧时,它的工作方式相同,但在本例中,AMQ Broker 会将 目的地
映射到队列。
SUBSCRIBE destination: /other/stomp/queue ack: client ^@
在前面的示例中,代理会将 目的地
映射到队列 /other/stomp/queue
。
将 STOMP 目的地映射到 JMS 目的地
JMS 目的地也映射到代理地址和队列。如果要使用 STOMP 发送消息到 JMS 目的地,STOMP 目的地必须遵循相同的约定:
通过添加queue.queue
.
的队列名称来发送或订阅 JMS Queue。例如,要向订购
JMS Queue 发送消息,STOMP 客户端必须发送该帧:SEND destination:jms.queue.orders hello queue orders ^@
通过在 主题 名称前面加上
jms.topic.
,发送或订阅 JMS 主题。例如,要订阅库存
JMS 主题,STOMP 客户端必须发送类似如下的帧:SUBSCRIBE destination:jms.topic.stocks ^@