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

csh*_*non 8 java spring jms spring-jms

我们刚刚升级到Spring 4和JMS 2.0.我们使用a CachingConnectionFactory和a 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支持的错误.

Ste*_*oll 4

就像您自己发现的那样,这确实是一个错误,并且在即将到来的4.0.64.1.RC1. 谢谢!