2014-07-01 46 views
7

我們剛升級到Spring 4和JMS 2.0。我們使用的是CachingConnectionFactoryJmsTemplate發佈消息,發現發佈到目的地時,第一次嘗試的作品,然後再嘗試發佈到相同的目的地會導致以下異常:Spring 4具有JMS 2.0的CachingConnectionFactory沒有正確緩存生產者

造成的:使用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支持的錯誤。

+0

我假設這是一個錯誤,我創建了一個Jira票據:https://jira.spring.io/browse/SPR-11949 – cshannon

回答

3

就像你發現你自己,這確實是一個錯誤,這是在即將到來的4.0.64.1.RC1解決。謝謝!

相關問題