2012-11-21 12 views
6

So che il componente JMS di Camel, per ricevere messaggi, utilizza Springs DefaultMessageListenerContainer. Può essere configurato per utilizzare la modalità CLIENT_ACKNOWLEDGE per il riconoscimento dei messaggi. La mia domanda è, quando viene chiamato il metodo message.acknowledge()? Si chiama internamente dal contenitore dell'ascoltatore della primavera?camel, JMS, modalità CLIENT_ACKNOWLEDGE

Oppure posso in qualche modo riconoscere il messaggio a mio piacimento?

vorrei evitare di scenario che i messaggi si perdono perché la mia app è schiantato durante l'elaborazione di questi messaggi e rendendolo transazionale sembra un po 'troppo pesante per me

risposta

8

OK. Dopo un po 'di debug e scansionando il codice sorgente ho scoperto che Camel usa Spring MessageContainers. AbstractMessageListenerContainer, in caso di modalità CLIENT_AKNOWLEDGE, richiama il messaggio di riconoscimento del metodo comitIfNecessario. Questo accade solo DOPO registrata MessageListener elabora un messaggio con successo (senza eccezioni)

Camel utilizza EndpointMessageListener che, alla fine, richiama il metodo processo di processore di nuova (o produttore) lungo il percorso. Poiché questa è una classica catena di responsabilità, se un processore in giù lungo il percorso genera un'eccezione o imposta un'eccezione su Exchange, verrà re-generato da EndpointMessageListener impedendo a AbstractMessageListener di riconoscere il messaggio.

+1

Grazie fratello per aver risparmiato il mio tempo. – andrey