带有 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。我们正在使用 CachingConnectionFactory
和 JmsTemplate
发布消息,并注意到当发布到目标时,第一次尝试有效,然后进一步尝试发布到同一目标会导致以下异常:
原因: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.6
和 4.1.RC1
中得到解决。谢谢!
【讨论】:
以上是关于带有 JMS 2.0 的 Spring 4 CachingConnectionFactory 不能正确缓存生产者的主要内容,如果未能解决你的问题,请参考以下文章
将带有 JMS (ActiveMQ) 的 Spring Boot 应用程序迁移到 GCP 的 pub-sub
带有 Spring JMS 的 Azure 接收多次接收相同的消息并将消息移动到 DLQ