Abbiamo appena effettuato l'aggiornamento a Spring 4 e JMS 2.0. Stiamo utilizzando un CachingConnectionFactory
e un JmsTemplate
di pubblicare messaggi e ho notato che quando si pubblica a una destinazione, i primi lavori tentativo e poi ulteriori tentativi di pubblicare alla stessa destinazione causare la seguente eccezione:Spring 4 CachingConnectionFactory con JMS 2.0 non corregge correttamente i produttori
causati da: javax. jms.IllegalStateException: il produttore è chiusa
Tutto ha funzionato bene con la Primavera 3.2 e 1.1 JMS così ho fatto un po 'scavare per vedere quale fosse il problema e sembra che il problema è nella classe CachedMessageProducer
. Normalmente questa classe re-implementa tutti i metodi nell'interfaccia MessageProducer
. In particolare, esiste un metodo close()
che viene nuovamente implementato e che reimposterà solo le proprietà, ma manterrà il produttore attivo (poiché si tratta di un factory di memorizzazione nella cache) dopo l'invio di un messaggio utilizzando JmsTemplate
.
Tuttavia, nella primavera 4 c'è un nuovo metodo chiamato getProxyIfNecessary
che determina se JMS 2.0 viene utilizzato o meno e quando rileva JMS 2.0 crea un proxy Jms2MessageProducerInvocationHandler
. Il metodo di richiamo di questo proxy sta delegando tutte le chiamate all'oggetto originale MessageProducer
e sembra ignorare le chiamate di metodo in CachedMessageProducer. Il risultato finale è che il metodo close viene chiamato sull'oggetto originale MessageProducer
(che non vogliamo poiché dovrebbe essere memorizzato nella cache). Ciò significa che i futuri tentativi di pubblicazione danno l'eccezione che il produttore è stato chiuso.
Qualcun altro ha già riscontrato questo problema? Non sono sicuro se sto facendo qualcosa di sbagliato o se questo è un bug con il nuovo supporto JMS 2.0 in primavera.
Suppongo che questo sia un bug e ho creato un ticket Jira: https://jira.spring.io/browse/SPR-11949 – cshannon