首页 文章

使用JMS 2.0的Spring 4 CachingConnectionFactory无法正确缓存 生产环境 者

提问于
浏览
7

我们刚刚升级到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 回答

  • 3

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

相关问题