使用JMS 2.0的Spring 4 CachingConnectionFactory不能正确缓存生产者

时间:2014-07-01 01:40:08

标签: java spring jms spring-jms

我们刚刚升级到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中的方法调用。最终结果是在原始的MessageProducer对象上调用close方法(我们不想要它,因为它应该被缓存)。这意味着未来的发布尝试会给出生产者已经关闭的例外情况。

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

1 个答案:

答案 0 :(得分:3)

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