我们刚刚升级到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中的方法调用 . 最终的结果是在原始的 MessageProducer
对象上调用close方法(我们不想要它,因为它应该被缓存) . 这意味着未来的发布尝试会给出 生产环境 者已经关闭的例外情况 .
有没有其他人之前有这个问题?我不确定我是否做错了,或者这是否是Spring中新的JMS 2.0支持的错误 .
1 回答
就像你发现自己一样,这确实是一个错误,这在即将到来的
4.0.6
和4.1.RC1
中得到了解决 . 谢谢!