Camel JMS 组件缓存级别和 Spring 的 CachingConnectionFactory

Camel JMS Component cache level and Spring's CachingConnectionFactory

根据 Apache camel 的文档,我们应该将缓存级别设置为 CACHE_CONSUMER 以在处理非 XA 事务时获得更好的性能。 可能他们这样做了,因为 PooledConnectionFactory 不缓存消费者。

我正在使用 Spring 的 CachingConnectionFactory 代替 PooledConnectionFactory,因为 PooledConnectionFactory 与 ActiveMQ 相结合,而我正在处理 IBMMQ。

另一方面,CachingConnectionFactory 也缓存生产者和消费者。 所以我希望在这种情况下,将 JmsComponent 的缓存级别设置为 CACHE_CONSUMER.

没有意义

如有错误请指正。 任何建议都会有很大帮助

是的,我感觉你理解到这里了。

如本 blog 的评论之一所述,

Although both the PooledConnectionFactory and the CachingConnectionFactory state that they each pool connections, sessions and producers, the PooledConnectionFactory does not actually create a cache of multiple producers. It simply uses a singleton pattern to hand out a single cached producer when one is requested. Whereas the CachingConnectionFactory actually creates a cache containing multiple producers and hands out one producer from the cache when one is requested.

通过在消费者级别缓存,即设置 CACHE_CONSUMER,这意味着连接、会话和消费者都被缓存。

但是,通过使用 CachingConnectionFactory,如 documented,您可以将消费者和生产者缓存默认设置为 true,并在需要时获得对它们的控制权。因此不需要更多的缓存级别。

其他帮助: Camel Docs

下午好,

你的理解基本正确。请注意,当您将 CACHE_CONSUMER 应用于侦听组件时,这意味着 Spring JMS 消息侦听器应该缓存消息使用者(有点明显)。缓存使用者需要 Spring JMS 消息侦听器也缓存 JMS 会话和连接。

如果您想使用事务处理端点,则必须从 Spring JMS 消息侦听器中移除此缓存的责任。在事务处理的情况下,您将缓存连接工厂外部化。这就是如果 transactedtrue 时级别默认为 CACHE_NONE 的原因。

当您将 transacted 设置为 true 并提供连接工厂时,将创建一个与连接工厂一起管理事务的 JMS 事务管理器。这就是 Spring JMS 消息侦听器无法管理 consumer/session/connection.

的原因

第一个答案是正确的,使用 CachingConnectionFactory 将使您获得所需的缓存,并且还将缓存从 Spring 消息侦听器容器中外部化。这允许事务管理器访问 JMS 会话。