我们希望在同一进程的不同线程上运行cms::MessageConsumer
和cms::MessageProducer
。
我们如何安全地做到这一点?
是否有两个cms::Connection
个对象和两个cms::Session
个对象,每个对象用于消费者和生产者,是否足以保证安全?这有必要吗?
静态库级别的对象之间是否存在共享状态会阻止此类用法?
答案 0 :(得分:5)
您应该阅读JMS v1.1规范,它清楚地调出哪些对象在多个线程中有效,哪些不是。即Session,MessageConsumer和MessageProducer被认为在线程之间共享是不安全的。我们通常会尝试尽可能地使它们成为线程安全的,但是肯定有一些方法可以让你自己陷入困境。在每个线程中使用单个会话通常是一个好主意,并且通常最好为每个MessageConsumer / MessageProducer使用会话,因为Session包含单个分派线程,这意味着与许多消费者的会话必须共享其分派线程用于向每个消费者发送消息,这可以根据场景降低延迟。
答案 1 :(得分:4)
我正在回答我自己的问题,以补充Tim Bish的答案,我接受这个答案提供了必要的信息。
来自http://activemq.apache.org/cms/cms-api-overview.html
什么是CMS?
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定义了一些限制并发使用的特定规则 会话。因为他们需要比我们更多的JMS细节知识 已经提交
表2-2支持并发使用的JMS对象
- 目的地:是
- ConnectionFactory:是
- 连接:是
- 会议:否
- MessageProducer:NO
- MessageConsumer:NO
这一点,将在后面描述。在这里我们将描述 施加它们的理由。
限制对Sessions的并发访问有两个原因。 首先,Sessions是支持事务的JMS实体。它是 很难实现多线程的事务。 其次,Sessions支持异步消息消费。它是 重要的是JMS不要求客户端代码用于异步 消息消费能够处理多个并发 消息。此外,如果已设置多个会话, 异步消费者,重要的是不要强制客户端 处理这些独立消费者同时发生的情况 执行。这些限制使JMS更易于使用 客户端。更复杂的客户端可以获得并发性 通过使用多个会话的愿望。
答案 2 :(得分:2)
据我所知,从Java端来看, connection 是线程安全的(创建起来相当昂贵),但 Session 和 messageProducer 不是线程安全的。因此,您似乎应该为每个线程创建一个Session。