3.5. 使用带有网络连接的 STOMP


Stomp 是一个文本线协议,它允许 STOMP 客户端与 STOMP Broker 进行通信。代理支持 STOMP 1.0、1.1 和 1.2。STOMP 客户端可用于多种语言和平台,使其成为互操作性的良好选择。

流程

  1. 打开 & lt;broker_instance_dir> /etc/broker.xml 配置文件。
  2. 配置现有的 acceptor 或创建一个新的,其中包含值为 STOMPprotocol 参数,如下所示:
<acceptors>
  <acceptor name="stomp-acceptor">tcp://localhost:61613?protocols=STOMP</acceptor>
  ...
</acceptors>
Copy to Clipboard Toggle word wrap

在上例中,代理接受端口 61613 上的 STOMP 连接,这是默认设置。

有关如何使用 STOMP 配置代理的示例,请参阅 STOMP 示例

3.5.1. Stomp 限制

使用 STOMP 时,会有以下限制:

  1. 代理目前不支持虚拟主机,这意味着 CONNECT 帧中的 host 标头被忽略。
  2. 消息确认不是事务的。ACK 帧不能是事务的一部分,如果设置了 事务 标头,它会被忽略。

3.5.2. 为 STOMP 消息提供 ID

当通过 JMS 使用者或 QueueBrowser 接收 STOMP 消息时,消息默认不包含任何 JMS 属性,如 JMSMessageID。但是,您可以使用代理参数在每个传入的 STOMP 消息上设置消息 ID。

流程

  1. 打开 & lt;broker_instance_dir&gt; /etc/broker.xml 配置文件。
  2. 对于用于 STOMP 连接的 acceptor,将 stompEnableMessageId 参数设置为 true,如下例所示:
<acceptors>
  <acceptor name="stomp-acceptor">tcp://localhost:61613?protocols=STOMP;stompEnableMessageId=true</acceptor>
  ...
</acceptors>
Copy to Clipboard Toggle word wrap

通过使用 stompEnableMessageId 参数,使用此接收器发送的每个 stomp 消息都添加了额外的属性。属性键为 amq-message-id,值是前缀为 "STOMP" 的内部消息 ID 的 String 表示,如下例所示:

amq-message-id : STOMP12345
Copy to Clipboard Toggle word wrap

如果配置中没有指定 stompEnableMessageId,则默认值为 false

3.5.3. 将连接时间设置为 live

STOMP 客户端必须在关闭其连接之前发送 DISCONNECT 帧。这允许代理关闭任何服务器端资源,如会话和消费者。但是,如果 STOMP 客户端在不发送 DISCONNECT 帧的情况下退出,或者如果失败,代理将无法立即知道客户端是否仍然处于活动状态。因此,STOMP 连接被配置为 "Time to Live" (TTL)为 1 分钟。这意味着,如果代理闲置超过 1 分钟,代理会停止与 STOMP 客户端的连接。

流程

  1. 打开 & lt;broker_instance_dir&gt; /etc/broker.xml 配置文件。
  2. connectionTTL 参数添加到用于 STOMP 连接的 acceptor 的 URI 中,如下例所示:
<acceptors>
  <acceptor name="stomp-acceptor">tcp://localhost:61613?protocols=STOMP;connectionTTL=20000</acceptor>
  ...
</acceptors>
Copy to Clipboard Toggle word wrap

在前面的示例中,使用 stomp-acceptor 的任何 stomp 连接都会将其 TTL 设置为 20 秒。

注意

STOMP 协议的版本 1.0 不包含任何心跳帧。因此,用户负责确保数据在 connection-ttl 中发送,或者代理会假定客户端已死机并清理服务器端资源。使用版本 1.1 时,您可以使用 core-beats 来维护 stomp 连接的生命周期。

将代理默认时间设置为 live

如前文所述,STOMP 连接的默认 TTL 为一分钟。您可以通过在代理配置中添加 connection-ttl-override 属性来覆盖这个值。

流程

  1. 打开 & lt;broker_instance_dir&gt; /etc/broker.xml 配置文件。
  2. 添加 connection-ttl-override 属性,并为新默认值提供值(毫秒)。它属于 < core&gt; 小节,如下所示。
<configuration ...>
  ...
  <core ...>
    ...
    <connection-ttl-override>30000</connection-ttl-override>
    ...
  </core>
<configuration>
Copy to Clipboard Toggle word wrap

在前面的示例中,STOMP 连接的默认生存时间(TTL)被设置为 30 秒,30000 毫秒。

3.5.4. 从 JMS 发送和接收和使用 STOMP 消息

STOMP 主要是一个文本性协议。为了更容易与 JMS 交互,STOMP 实施会检查 内容长度 标头的存在,以决定如何将 STOMP 消息映射到 JMS。

Expand
表 3.3. 将 STOMP 消息映射到 JMS
如果您希望 STOMP 消息映射到 …​消息 should…​。

JMS TextMessage

不包括 content-length 标头。

JMS BytesMessage

包括一个 content-length 标头。

当将 JMS 消息映射到 STOMP 时,也会应用相同的逻辑。STOMP 客户端可以确认是否存在 content-length 标头,以确定消息正文的类型(字符串或字节数)。

有关消息标头的更多信息,请参阅 STOMP 规格。

在发送消息和订阅时,STOMP 客户端通常包含一个 目的地 标头。目标名称是字符串值,映射到代理上的目的地。在 AMQ Broker 中,这些目的地映射到 addressesqueues。有关目的地帧的更多信息,请参阅 STOMP 规格。

取一个发送以下消息的 STOMP 客户端示例(包括 headers 和 body):

SEND
destination:/my/stomp/queue

hello queue a
^@
Copy to Clipboard Toggle word wrap

在这种情况下,代理会将消息转发到与地址 /my/stomp/queue 关联的任何队列。

例如,当 STOMP 客户端发送一条消息时(使用 SEND 帧),指定的目的地映射到一个地址。

当客户端发送 SUBSCRIBEUNSUBSCRIBE 帧时,它的工作方式相同,但在这种情况下,AMQ Broker 将 目的地映射 到队列。

SUBSCRIBE
destination: /other/stomp/queue
ack: client

^@
Copy to Clipboard Toggle word wrap

在前面的示例中,代理会将 目的地映射 到队列 /other/stomp/queue

将 STOMP 目的地映射到 JMS 目的地

JMS 目的地也映射到代理地址和队列。如果要使用 STOMP 发送消息到 JMS 目的地,stomp 目的地必须遵循相同的约定:

  • 通过 jms.queue 添加队列名称来发送或订阅 JMS Queue。例如,要将信息发送到 orders JMS Queue,STOMP 客户端需要发送帧:

    SEND
    destination:jms.queue.orders
    hello queue orders
    ^@
    Copy to Clipboard Toggle word wrap
  • 通过添加主题名称以 jms.topic 形式发送或订阅 JMS 主题。例如,要订阅 库存 JMS 主题,STOMP 客户端必须发送类似如下的帧:

    SUBSCRIBE
    destination:jms.topic.stocks
    ^@
    Copy to Clipboard Toggle word wrap
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat