1

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

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

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

如果我错了,请纠正我。任何建议都会有很大帮助

4

2 回答 2

2

是的,我觉得你的理解就在这里。

正如该博客的评论之一所述,

尽管它们都PooledConnectionFactory表示 CachingConnectionFactory它们每个池连接、会话和生产者,但它们PooledConnectionFactory实际上并没有创建多个生产者的缓存。它只是使用单例模式在被请求时分发单个缓存的生产者。而CachingConnectionFactory实际上创建一个包含多个生产者的缓存,并在请求一个生产者时从缓存中分发一个生产者。

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

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

附加帮助: 骆驼文档

于 2020-04-26T13:45:36.960 回答
2

下午好,

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

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

当您设置transactedtrue提供连接工厂时,会创建一个 JMS 事务管理器,它与连接工厂一起管理事务。这就是 Spring JMS 消息监听器无法管理消费者/会话/连接的原因。

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

于 2020-04-27T17:19:55.723 回答