多个 JMS ConnectionFactory

Posted

技术标签:

【中文标题】多个 JMS ConnectionFactory【英文标题】:More than one JMS ConnectionFactory 【发布时间】:2014-04-23 13:40:49 【问题描述】:

我是 JMS 的新手,目前正在开发一个简单的聊天应用程序,在 Oreilly 的“Java 消息服务”中进行了说明。我在 ActiveMQ 中配置了一个 TopicConnectionFactory,它从 TopicPublishers 接收聊天消息并将其发送给 TopicSubscribers。

我的问题是“为什么我们需要在任何 JMS 应用程序中创建多个 TopicConnectionFactory”?既然 Connectionfactory 实例不与主题/队列绑定,为什么我们不能使用一个 ConnectionFactory 实例来创建与应用程序中配置的所有主题(或队列)的连接?

【问题讨论】:

【参考方案1】:

从技术上讲,您是对的。您可能只能使用一个 ConnectionFactory。

但是,根据您的要求使用多个 ConnectionFactories 是一种更好的设计,这样流量会均匀分布,并且不会耗尽连接。

因此,如果您知道可能有问题的 JMS 客户端应用程序(逻辑不允许正确处理打开/关闭连接),您可以将其隔离以使用自己的连接工厂。

此外,一些连接工厂允许同时包含 10 个默认活动连接的池(这取决于实施/设置),如果您需要更多,您可以使用多个连接工厂。

【讨论】:

【参考方案2】:

我在 ActiveMQ 中配置了一个 TopicConnectionFactory,它接收来自 TopicPublishers 的聊天消息并将其分派给 TopicSubscribers。

非常模棱两可的说法。 TopicConnectionFactory 不接收或发送任何消息。它只是用于创建Connection 的管理对象之一,而Connection 又创建Session,而Session 又创建发布和订阅消息的发布者和订阅者。

为什么我们不能使用 ConnectionFactory 的一个实例来创建与应用程序中配置的所有主题(或队列)的连接?

你绝对可以。没有人阻止你这样做。

根据规格

一个连接工厂对象封装了一组连接配置 由管理员定义的参数。客户使用它来 创建与 JMS 提供者的连接。

因此,除非您有不同的配置要求,否则您可以使用相同的ConnectionFactory 创建多个连接。是的,正如 otc 上面提到的,连接数是配置参数之一。

【讨论】:

以上是关于多个 JMS ConnectionFactory的主要内容,如果未能解决你的问题,请参考以下文章

Jms:具有多个消费者的 Pub/Sub

如何在 Spring Java Config 的单个 MessageListenerContainer 中添加多个 JMS MessageListner

消息服务jms

如何使用 Spring JMS 在 ActiveMQ 中创建多个侦听器

如何将 JMS 队列视为临时存储?

JMS 主题与选择器