2012-05-11 16 views
6

Sto utilizzando Spring JMS per connettersi a un server Websphere MQ. Ho implementato l'interfaccia SessionAwareListener per creare un listener personalizzato, riutilizzando il vecchio codice per la logica aziendale.Come limitare il numero di volte in cui JMS DefaultMessageListenerContainer ritenta un messaggio?

Durante il test, il listener genera una stringa StringIndexOutOfBoundsException, che non riesco a rilevare. Tuttavia, vedo nel log il seguente stampato circa 32 volte, poi il DMLC si ferma.

WARN - Execution of JMS message listener failed 

C'è un modo per controllare la frequenza con cui DMLC riproverà un messaggio, e come gestire le eccezioni non gestite fanno?

+0

Quindi utilizzare l'adattatore JCA IBM MQ? Dove viene distribuita la tua applicazione Spring? – DaTroop

+0

No stiamo usando solo Websphere MQ, non il server delle applicazioni. L'applicazione Spring è una JVM indipendente. –

risposta

5

È sempre possibile controllare JMSDeliveryCount. Se è superiore al numero che consideri come massimo, non elaborare il messaggio e tornare.

È inoltre possibile configure your Websphere spostare il messaggio non valido nella destinazione dell'eccezione dopo alcuni tentativi.

+0

Grazie per l'articolo. Questo ha aiutato a vedere cosa stava accadendo nel back-end. Ora sto utilizzando le proprietà JMS JMSXDeliveryCount e JMSRedelivered per gestire il messaggio. –

+0

Ti capita di sapere qualcosa nell'API di Spring che potrebbe aiutarti anche nella gestione degli errori? –

+0

Sfortunatamente non so molto di primavera, amico mio. – DaTroop

5

Rimettere un messaggio in coda dopo che si è verificato un errore backout nel mondo Websphere MQ.

ci sono due alternative come gestirlo:

  1. Nella gestore code: è possibile configurare la soglia backout e backout nome riaccodamento proprietà per la coda data. Una volta raggiunta la soglia di backout, il gestore code inserirà il messaggio nella coda specificata dal nome di riaccodamento del backout anziché riconsegnarlo. Vedere WebSphere MQ queue properties per ulteriori informazioni.

  2. Nell'applicazione: se si utilizza l'API JMS, controllare la proprietà JMSXDeliveryCount chiamando msessage.getIntProperty("JMSXDeliveryCount") prima di iniziare l'elaborazione del messaggio. Se raggiunge una certa soglia, gestisci il messaggio come errato.

+0

Grazie per la risposta! Il tuo in collaborazione con DaTroop ha aiutato a risolvere il problema. –

+0

In 1, le proprietà MQ sono BOTHRESH per il limite dei tentativi e BOQNAME per la coda in cui il messaggio verrà inoltrato una volta raggiunto il limite di tentativi. –

Problemi correlati