带有 JMS 2.0 的 Spring 4 CachingConnectionFactory 不能正确缓存生产者

Posted

技术标签:

【中文标题】带有 JMS 2.0 的 Spring 4 CachingConnectionFactory 不能正确缓存生产者【英文标题】:Spring 4 CachingConnectionFactory with JMS 2.0 doesn't properly cache Producers 【发布时间】:2014-08-21 11:39:46 【问题描述】:

我们刚刚升级到 Spring 4 和 JMS 2.0。我们正在使用 CachingConnectionFactoryJmsTemplate 发布消息,并注意到当发布到目标时,第一次尝试有效,然后进一步尝试发布到同一目标会导致以下异常:

原因:javax.jms.IllegalStateException:生产者关闭

Spring 3.2 和 JMS 1.1 一切正常,所以我进行了一些挖掘以查看问题所在,似乎问题出在 CachedMessageProducer 类中。通常此类重新实现MessageProducer 接口中的所有方法。具体来说,有一个 close() 方法被重新实现,并且只会在使用 JmsTemplate 发送消息后重置属性但保持生产者活动(因为它是一个缓存工厂)。

不过,Spring 4 中有一个名为 getProxyIfNecessary 的新方法,它确定是否正在使用 JMS 2.0,当它检测到 JMS 2.0 时,它会创建一个 Jms2MessageProducerInvocationHandler 代理。该代理的invoke 方法将所有调用委托给原始MessageProducer 对象,并且似乎绕过了CachedMessageProducer 中的方法调用。最终结果是 close 方法在原始 MessageProducer 对象上被调用(我们不希望它,因为它应该被缓存)。这意味着未来的发布尝试会给出生产者已关闭的异常。

以前有没有其他人遇到过这个问题?我不确定我做错了什么,或者这是否是 Spring 中新的 JMS 2.0 支持的错误。

【问题讨论】:

我假设这是一个错误,我创建了一个 Jira 票证:jira.spring.io/browse/SPR-11949 【参考方案1】:

就像您自己发现的那样,这确实是一个错误,这将在即将发布的 4.0.64.1.RC1 中得到解决。谢谢!

【讨论】:

以上是关于带有 JMS 2.0 的 Spring 4 CachingConnectionFactory 不能正确缓存生产者的主要内容,如果未能解决你的问题,请参考以下文章

将带有 JMS (ActiveMQ) 的 Spring Boot 应用程序迁移到 GCP 的 pub-sub

带有 Spring JMS 的 Azure 接收多次接收相同的消息并将消息移动到 DLQ

Spring整合JMS

Spring JMS ActiveMQ 跟踪作业状态

ActiveMQ rebalanceClusterClients 不适用于 Spring Boot JMS

Wildfly 上的 JMS 2.0 QueueBrowser 不返回消息