Stomp 支持
ActiveMQ-CPP Stomp 支持
Stomp 是一种由 ActiveMQ Broker 支持的简单文本协议,允许从各种客户端(例如 C++、Java、.NET、Ruby、Python 等)进行通信。如果您想了解更多关于 stomp 协议的信息,请查看 https://stomp.github.io/.
ActiveMQ-CPP 实现的 CMS API 与 stomp 有些特殊之处,因为它是一个简单的协议,并不具备像 OpenWire 那样完整的功能。此页面的目的是记录这些特殊之处,以便用户了解他们偶尔可能会看到的任何奇怪行为。
Stomp CMS 中的消息属性
由于 Stomp 严格来说是基于文本的,它不支持指定消息属性类型(在 stomp 行话中称为“标题”)的方法。这意味着作为整数发送的属性可能被 Stomp CMS 客户端读取为以下任意一种:字符串、整数、短整型、长整型等。
例如,当 Java 客户端向代理发送带有整数属性(“myval”=1)的消息时,代理会将消息从 openwire 转换为 stomp,并在过程中将属性“myval”转换为字符串“1”并发送给客户端。客户端接收字符串,但允许用户以任何对 std::istringstream » 运算符有效的方式读取此值。
对传出消息写入值也是如此。您可以调用任何方法(例如 setIntProperty)。然而,最终发送到网络上的值仍然是字符串。
临时主题和队列
Stomp 协议不支持临时主题或队列的概念。如果您调用 cms::Session 的 createTemporaryTopic 或 createTemporaryQueue 方法,将抛出类型为 NotSupportedException 的异常。要实现请求/响应类型的语义,您需要使用标准主题和队列。
关于 Stomp 中选择器的使用说明
Stomp 通常只允许每个连接一个会话。在 ActiveMQ-CPP 中,我们创建了一种虚拟会话,允许每个连接创建多个会话。唯一需要注意的是,我们创建的主 Stomp 会话上仍然只能有一个选择器,因此第一个使用选择器创建的会话将是唯一一个真正有效的选择器,因为新创建的会话即使在创建时传递了选择器也不会应用任何选择器。
Stomp 和故障转移
当前 Stomp 协议处于 V1.0 版本,该协议没有提供必要的特性来允许使用基于 Stomp 的传输进行故障转移。Stomp v1.1 的草案版本正在进行中,其中包括在代理和客户端之间进行心跳监控的条款,这将允许检测连接丢失。但是,即使有这种支持,Stomp 客户端在故障转移时也能实现的功能也会有限制,事务将无法恢复,消息恢复也不可能。Stomp 故障转移需要几乎像一个新的 Stomp 连接到代理一样运行,并为活动的消费者自动重新订阅,所有当前预取的消息都将从活动的消费者中清除。在 Stomp v1.1 规范获得批准并且 ActiveMQ-CPP 客户端代码更新以支持它之前,不建议您将 Stomp 传输和故障转移传输结合使用。