【问题标题】:Which is better: PooledConnectionFactory or CachingConnectionFactory?哪个更好:PooledConnectionFactory 或 CachingConnectionFactory?
【发布时间】:2013-11-02 20:07:31
【问题描述】:

我们在 Tomcat (7.0.41) 中使用 Spring (3.2.4) 和 ActiveMQ (5.8.0),目前尚不清楚最佳用法。我们想使用 JmsTemplate 来生产和 MessageListenerContainer 来接收消息。

我们应该在接收端使用缓存吗? (related link)
使用 ActiveMQ 和故障转移工作 CachingConnectionFactory? (related link)
使用 PooledConnectionFactory 时需要设置 useAsyncSend="true" 吗? (related link)

【问题讨论】:

  • 我在 Spring (3.0.7)、ActiveMQ (5.5.0) 和 Tomcat 中使用 CachingConnectionFactory 进行消息生产 (JmsTemplate) 和消费 (DefaultMessageListenerContainer) 已经一年多了,没有遇到任何问题.通常,我的消费者处理来自 queue_1 的消息并通过将消息发布到 queue_2 来完成,但队列交互使用相同的 CachingConnectionFactory。

标签: java spring tomcat jms activemq


【解决方案1】:

来自here

PooledConnectionFactory 和 CachingConnectionFactory 的区别在于实现上的区别。以下是它们之间的一些不同特征:

  • 虽然 PooledConnectionFactory 和 CachingConnectionFactory 都声明它们各自汇集连接、会话和生产者,但 PooledConnectionFactory 实际上并没有创建多个生产者的缓存。它只是使用单例模式在请求时分发单个缓存的生产者。而 CachingConnectionFactory 实际上创建了一个包含多个生产者的缓存,并在请求一个生产者时从缓存中分发一个生产者。

  • PooledConnectionFactory 构建在 Apache Commons Pool 项目之上,用于池化 JMS 会话。这允许对池进行一些额外的控制,因为 Commons Pool 中的某些功能未被 PooledConnectionFactory 使用。这些附加功能包括增加池大小而不是阻塞、在池耗尽时引发异常等。您可以通过使用自己的自定义设置创建自己的 Commons Pool GenericObjectPool 来利用这些功能,然后将该对象通过setPoolFactory 方法。有关更多信息,请参阅以下内容:http://commons.apache.org/pool/api-1.4/org/apache/commons/pool/impl/GenericObjectPoolFactory.html

  • CachingConnectionFactory 还能够缓存消费者。使用此功能时只需要小心,以便您知道消费者是根据博客文章中提到的规则进行缓存的。

  • 但最重要的是,CachingConnectionFactory 可以与任何符合 JMS 的 MOM 一起使用。它只需要一个 JMS 连接工厂。如果您使用多个 MOM 供应商,这在企业组织中很常见(这主要是由于遗留项目和现有项目),这一点很重要。重要的一点是 CachingConnectionFactory 可以很好地与许多不同的 MOM 实现配合使用,而不仅仅是 ActiveMQ。

来自here

  • 如果您有集群的 ActiveMQ,并使用故障转移传输,则报告说 CachingConnectionFactory 不是正确的选择。

  • 我遇到的问题是,如果一个盒子坏了,我们应该开始 在另一个上发送消息,但它似乎仍在使用旧的 连接(每次发送超时)。如果我重新启动程序,它会 再次连接,一切正常。资源: Autoreconnect problem with ActiveMQ and CachingConnectionFactory

  • 问题是到失败的 ActiveMQ 的缓存连接是 仍在使用中,这给用户带来了问题。现在 此方案的选择是 PooledConnectionFactory。

  • 如果您现在使用 ActiveMQ,并且将来可能会切换到其他代理(JBoss MQ、WebSphere MQ),请不要使用 PooledConnectionFactory,因为它将您的代码紧密耦合到 ActiveMQ。

【讨论】:

  • 这是对两个工厂的一个很好的整体描述,但我要补充几点:我们应该在接收端使用缓存吗?我在 ActiveMQ in Action 书中发现这不是必需的。使用 ActiveMQ 和故障转移工作 CachingConnectionFactory? “自动重新连接问题...”链接包含 2 个相反的答案,但似乎 PooledConnectionFactory 肯定会工作,所以我们将使用它(我们不打算使用另一个 MOM)。使用 PooledConnectionFactory 时需要设置 useAsyncSend="true" 吗?我们仍然不知道,但如果设置它应该没有问题。 :)
  • 异步发送:告诉生产者不要阻塞等待发送的每条消息的确认:activemq.apache.org/async-sends.html(我认为这应该不是问题)
  • 我认为最好在另一个问题中提出您的新问题;)
  • CachingConnectionFactory 扩展 SingleConnectionFactory 和 SingleConnectionFacotury 的文档说“从所有 createConnection() 调用返回相同连接的 JMS ConnectionFactory 适配器”。那么,如果它一直返回相同的连接,那么为什么说它正在执行连接池呢?连接池和会话池之间的实际区别是什么?
【解决方案2】:

但是 spring 实现的缺点 - 它不支持 XA 事务。但是 activemq 实现支持它(XAPooledConnectionFactory)。所以,我会说,如果您将 JMS 与其他资源甚至与另一个 jms 代理一起使用并且想要进行交易 - 使用 activemq 实现。当然,PooledConnectionFactory 也可以与任何符合 JMS 的 MOM 一起使用

【讨论】:

    猜你喜欢
    • 2013-03-16
    • 1970-01-01
    • 2011-02-22
    • 2013-06-06
    • 1970-01-01
    • 2013-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多