ActiveMQ线程安全吗?

Tho*_*eod 3 c++ multithreading activemq-classic activemq-cpp

我们希望我们的运行cms::MessageConsumer,并cms::MessageProducer在不同的同一进程的线程.

我们如何安全地做到这一点?

是否有两个cms::Connection物体和两个cms::Session物体,一个用于消费者和生产者,足以保证安全?这有必要吗?

静态库级别的对象之间是否存在共享状态会阻止此类用法?

Tim*_*ish 5

您应该阅读JMS v1.1规范,它清楚地调出哪些对象在多个线程中有效,哪些不是.即Session,MessageConsumer和MessageProducer被认为在线程之间共享是不安全的.我们通常会尝试尽可能地使它们成为线程安全的,但肯定有一些方法可以让你自己陷入困境.在每个线程中使用单个会话通常是一个好主意,并且通常最好为每个MessageConsumer/MessageProducer使用会话,因为Session包含单个分派线程,这意味着与许多消费者的会话必须共享其分派线程用于向每个消费者发送消息,这可以根据场景降低延迟.


Tho*_*eod 5

我正在回答我自己的问题,以补充蒂姆·比什的答案,我接受该答案提供了基本信息。

来自http://activemq.apache.org/cms/cms-api-overview.html

什么是内容管理系统?

CMS API 是 Java 中 JMS API 的 C++ 推论,用于从分布在网络上或位于同一计算机上的客户端发送和接收消息。在 CMS 中,我们尽一切努力保持与 JMS api 尽可能多的同等性,仅当 JMS 功能强烈依赖于 Java 编程语言本身的功能时才有所不同。尽管存在一些差异,但大多数差异都很小,而且在大多数情况下 CMS 都遵循 JMS 规范,因此牢牢掌握 JMS 的工作原理应该会使使用 CMS 变得更加容易。

JMS 规范对线程安全有何规定?

在此处下载规范: http://download.oracle.com/otndocs/jcp/7195-jms-1.1-fr-spec-oth-JSpec/

2.8 多线程 JMS 可能要求其所有对象都支持并发使用。由于对并发访问的支持通常会增加一些开销和复杂性,因此 JMS 设计限制了对并发访问那些自然由多线程客户端共享的对象的要求。其余部分被设计为一次由一个逻辑控制线程访问。JMS定义了一些限制Session并发使用的特定规则。因为它们需要比我们在此处介绍的更多的 JMS 细节知识

表 2-2 支持并发使用的 JMS 对象

  • 目的地:是
  • 连接工厂:是
  • 连接:是
  • 会议:否
  • 消息生产者:NO
  • 消息消费者:NO

关于这一点,他们将在后面描述。在这里,我们将描述施加它们的理由。

限制对会话的并发访问有两个原因。首先,Sessions是支持事务的JMS实体。实现多线程事务是非常困难的。其次,Sessions支持异步消息消费。重要的是,JMS 不要求用于异步消息消费的客户端代码能够处理多个并发消息。此外,如果会话已设置有多个异步消费者,那么客户端不必被迫处理这些单独的消费者同时执行的情况,这一点很重要。这些限制使 JMS 更易于典型客户端使用。更复杂的客户端可以通过使用多个会话来获得他们想要的并发性。