Java 带有JMS 2.0的Spring 4 CachingConnectionFactory不';不能正确缓存生产者
我们刚刚升级到Spring4和JMS 2.0。我们使用Java 带有JMS 2.0的Spring 4 CachingConnectionFactory不';不能正确缓存生产者,java,spring,jms,spring-jms,Java,Spring,Jms,Spring Jms,我们刚刚升级到Spring4和JMS 2.0。我们使用CachingConnectionFactory和JmsTemplate来发布消息,并注意到在发布到目标时,第一次尝试有效,然后再次尝试发布到同一目标会导致以下异常: 原因:javax.jms.IllegalStateException:生产者已关闭 Spring3.2和JMS1.1的一切都很好,所以我做了一些挖掘,看看问题出在哪里,问题似乎出在CachedMessageProducer类中。通常,此类重新实现MessageProducer接
CachingConnectionFactory
和JmsTemplate
来发布消息,并注意到在发布到目标时,第一次尝试有效,然后再次尝试发布到同一目标会导致以下异常:
原因:javax.jms.IllegalStateException:生产者已关闭
Spring3.2和JMS1.1的一切都很好,所以我做了一些挖掘,看看问题出在哪里,问题似乎出在CachedMessageProducer
类中。通常,此类重新实现MessageProducer
接口中的所有方法。具体来说,有一个close()
方法,该方法被重新实现,在使用JmsTemplate
发送消息后,它只会重置属性,但会使生产者保持活动状态(因为它是一个缓存工厂)
但是,Spring4中有一个名为GetProxyIfEssential
的新方法,用于确定是否正在使用JMS 2.0,并在检测到JMS 2.0时创建一个Jms2MessageProducerInvocationHandler
代理。此代理的invoke方法将所有调用委托给原始MessageProducer
对象,并且似乎绕过了CachedMessageProducer中的方法调用。最终的结果是对原始的MessageProducer
对象调用close方法(我们不需要它,因为它应该被缓存)。这意味着未来发布的尝试会给出一个例外,即制作人已关闭
以前还有其他人有过这个问题吗?我不确定我是否做错了什么,或者这是Spring新的JMS 2.0支持中的一个错误。就像您自己发现的,这确实是一个错误,这在即将发布的
4.0.6
和4.1.RC1
中得到了解决。谢谢 我假设这是一个bug,我创建了一个Jira票证: