【发布时间】:2020-10-17 21:52:52
【问题描述】:
使用侦听器设置 CMS 消费者涉及两个单独的调用:首先,获取消费者:
cms::MessageConsumer* cms::Session::createConsumer( const cms::Destination* );
然后,在消费者上设置一个监听器:
void cms::MessageConsumer::setMessageListener( cms::MessageListener* );
如果实现在侦听器激活之前订阅目的地(并从代理/路由器接收消息),消息会丢失吗?还是这些消息在内部排队并在激活时传递给侦听器?
为什么没有 API 调用来创建使用侦听器作为构造参数的消费者? (是因为 JMS 规范没有吗?)
(附录:这可能是 API 本身的一个缺陷。更合乎逻辑的顺序是从会话中实例化消费者,并在 API 中有一个cms::Consumer::subscribe( cms::Destination*, cms::MessageListener* ) 方法。)
【问题讨论】:
-
activemq-cpp 发行版中的
SimpleAsyncConsumer示例是一部彻头彻尾的恐怖秀,是一部糟糕的 C++ 经典。它看起来像是 Java 程序员尝试编写 C++ 的工作。 -
如果 ActiveMQ CMS 不能满足您的需求,总会有使用 AMQP 的 C++ 客户端。此外,C++ STOMP 客户端。 ActiveMQ 支持这两种协议。
-
关于 Qpid Proton C++ 客户端的说法越少越好。 (代码库看起来更合理,但是基于一些愚蠢的“proactor”设计模式的 API 来自 Mars;而且 AMQP 1.0 似乎不太适合 pub/sub)不过,我仍然从 CMS 获得有用的里程。也许粗糙的边缘并非不可克服。
-
如果需要,我也不反对修改源代码。有一些非常明显的嚎叫,例如开发人员忘记 - 或者不知道 - C++ 支持协变返回类型,所以你会发现像
ActiveMQConnectionFactory::createConnection()这样的 Java 主义返回cms::Connection*,无缘无故失去了需要dynamic_cast才能在客户端恢复的子类类型代码...叹息 -
它是开源的。我相信捐款会受到欢迎。另外,我相信正在开发一个新的 Qpid C++ 客户端。请参阅qpid.2158936.n2.nabble.com/… 进行讨论。
标签: activemq activemq-cpp