哪个更好:PooledConnectionFactory或CachingConnectionFactory?

时间:2013-10-24 08:12:47

标签: java spring tomcat jms activemq

我们在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

2 个答案:

答案 0 :(得分:39)

来自here

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

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

  • PooledConnectionFactory构建于Apache Commons Pool项目之上,用于池化JMS会话。这允许对池进行一些额外的控制,因为Commons Pool中的功能没有被PooledConnectionFactory使用。这些附加功能包括增加池大小而不是阻塞,在池耗尽时抛出异常等。您可以使用自己的自定义设置创建自己的Commons Pool GenericObjectPool,然后通过以下方法将该对象传递给PooledConnectionFactory来利用这些功能。 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的。

答案 1 :(得分:1)

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