4

我们想在同一进程的不同线程上运行我们的cms::MessageConsumer和。cms::MessageProducer

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

拥有两个cms::Connection对象和两个cms::Session对象,消费者和生产者各一个,是否足以保证安全?这是必要的吗?

静态库级别的对象之间是否存在阻止这种使用的共享状态?

4

3 回答 3

6

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

于 2012-12-20T19:57:31.217 回答
4

我正在回答我自己的问题以补充 Tim Bish 的回答,我接受它提供了基本信息。

来自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 定义了一些限制会话并发使用的特定规则。因为他们需要的 JMS 细节知识比我们在

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

  • 目的地:是
  • 连接工厂:是
  • 连接:是
  • 会话:没有
  • 消息生产者:否
  • 消息消费者:否

这一点,它们将在后面描述。在这里,我们将描述施加它们的基本原理。

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

于 2012-12-21T06:45:23.607 回答
2

据我从 Java 方面了解,连接是线程安全的(创建起来相当昂贵),但SessionmessageProducer不是线程安全的。因此,您似乎应该为每个线程创建一个会话。

于 2012-12-20T18:27:08.620 回答