我們剛升級到Spring 4和JMS 2.0。我們使用的是CachingConnectionFactory
和JmsTemplate
發佈消息,發現發佈到目的地時,第一次嘗試的作品,然後再嘗試發佈到相同的目的地會導致以下異常: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支持的錯誤。
我假設這是一個錯誤,我創建了一個Jira票據:https://jira.spring.io/browse/SPR-11949 – cshannon