Wir haben gerade ein Upgrade auf Spring 4 und JMS 2.0 durchgeführt. Wir sind mit einem CachingConnectionFactory
und JmsTemplate
Nachrichten zu veröffentlichen und festgestellt, dass, wenn zu einem Ziel zu veröffentlichen, die ersten Arbeiten Versuch und dann weitere Versuche zum gleichen Ziel zu veröffentlichen, die folgende Ausnahme verursachen:Spring 4 CachingConnectionFactory mit JMS 2.0 wird nicht korrekt zwischengespeichert Hersteller
Verursacht durch: javax. jms.IllegalStateException: der Hersteller ist geschlossen
Alles hat gut funktioniert mit Feder 3.2 und JMS 1.1, so habe ich einige graben, um zu sehen, was das Problem war und es scheint, das Problem in der CachedMessageProducer
Klasse. Normalerweise implementiert diese Klasse alle Methoden in der MessageProducer
Schnittstelle neu. Insbesondere gibt es eine close()
Methode, die neu implementiert wird und nur Eigenschaften zurücksetzt, aber den Hersteller am Leben erhält (da es sich um eine Zwischenspeicherungs-Factory handelt), nachdem eine Nachricht mit der JmsTemplate
gesendet wurde. In Spring 4 gibt es eine neue Methode namens getProxyIfNecessary
, die feststellt, ob JMS 2.0 verwendet wird, und wenn JMS 2.0 erkannt wird, wird ein Jms2MessageProducerInvocationHandler
-Proxy erstellt. Die Aufrufmethode dieses Proxys delegiert alle Aufrufe an das ursprüngliche Objekt MessageProducer
und scheint Methodenaufrufe im CachedMessageProducer zu umgehen. Das Endergebnis ist, dass die close-Methode für das ursprüngliche MessageProducer
-Objekt aufgerufen wird (was wir nicht wollen, da es zwischengespeichert werden sollte). Dies bedeutet, dass zukünftige Veröffentlichungsversuche die Ausnahme bilden, dass der Produzent geschlossen wurde.
Hat jemand anderes dieses Problem schon einmal gehabt? Ich bin mir nicht sicher, ob ich etwas falsch mache oder ob dies ein Fehler mit der neuen JMS 2.0-Unterstützung im Frühjahr ist.
Ich gehe davon aus, dass dies ein Fehler ist, und ich habe ein Jira-Ticket erstellt: https://jira.spring.io/browse/SPR-11949 – cshannon