根据Apache camel的文档,我们应该将缓存级别设置为CACHE_CONSUMER,以在处理非XA事务时获得更好的性能。 可能他们这样做了,因为PooledConnectionFactory不缓存使用者。
我使用Spring的CachingConnectionFactory代替PooledConnectionFactory,因为PooledConnectionFactory是与ActiveMQ结合使用的,并且我正在处理IBMMQ。
另一方面,CachingConnectionFactory也缓存生产者和使用者。 因此,我希望在这种情况下,将JmsComponent的缓存级别设置为CACHE_CONSUMER是没有意义的。
如果我错了,请纠正我。 任何建议都会有很大帮助
答案 0 :(得分:1)
是的,我觉得您的理解就在这里。
如对此blog的评论之一所述,
尽管
PooledConnectionFactory
和CachingConnectionFactory
声明它们各自汇集连接, 会话和生产者,PooledConnectionFactory
不会 实际上创建了多个生产者的缓存。它只是使用一个 单例模式,当一个是 要求。而CachingConnectionFactory
实际上创建了一个 包含多个生产者的缓存,并从中分发一个生产者 请求一个缓存。
通过在使用者级别进行高速缓存,即设置CACHE_CONSUMER
,这意味着连接,会话和使用者都已被高速缓存。
但是,通过将CachingConnectionFactory
用作documented,可以将使用者和生产者缓存的默认值都设置为true
,并在需要时对其进行控制。因此,不需要更多的缓存级别。
其他帮助: Camel Docs
答案 1 :(得分:1)
下午好,
您的理解在很大程度上是正确的。请注意,当您将CACHE_CONSUMER
应用于侦听组件时,这意味着Spring JMS消息侦听器应该缓存消息使用者(显然是这样)。缓存使用者需要Spring JMS消息侦听器还缓存JMS会话和连接。
如果要使用事务处理的终结点,则必须从Spring JMS消息侦听器中删除此缓存的职责。在事务情况下,您将缓存连接工厂外部化。这就是为什么如果CACHE_NONE
为transacted
,则级别默认为true
的原因。
将transacted
设置为true
并提供连接工厂时,将创建一个JMS事务管理器,该管理器与该连接工厂一起管理事务。这就是为什么Spring JMS消息侦听器无法管理使用者/会话/连接的原因。
第一个答案是正确的,使用CachingConnectionFactory
将为您提供所需的缓存,并将缓存从Spring消息侦听器容器外部化。这使事务管理器可以访问JMS会话。