2012-11-21 12 views
6

Wiem, że komponent JMS Camela do odbierania wiadomości używa Springs DefaultMessageListenerContainer. Może być skonfigurowany do używania trybu CLIENT_ACKNOWLEDGE do potwierdzania wiadomości. Moje pytanie brzmi, kiedy dokładnie wywoływana jest metoda message.acknowledge()? Czy jest on nazywany wewnętrznie przez pojemnik ze słuchaczami wiosennym?Tryb wielbłąd, JMS, CLIENT_ACKNOWLEDGE

Czy mogę w jakiś sposób potwierdzić wiadomość zgodnie z moją wolą?

Chciałbym uniknąć scenariusza, że ​​wiadomości zgubić ponieważ moja aplikacja rozbił się podczas przetwarzania tych wiadomości i co transakcyjny wydaje się nieco zbyt ciężki dla mnie

Odpowiedz

8

OK. Po jakimś debugowaniu i skanowaniu za pomocą kodu źródłowego odkryłem, że Camel używa wiosny MessageListenerContainers. Klasa AbstractMessageListenerContainer, w przypadku trybu CLIENT_AKNOWLEDGE, wywołuje komunikat informujący o konieczności comitIfNessess. Zdarza się to tylko po tym, jak zarejestrowana wiadomość MessageListener przetwarza wiadomość z powodzeniem (bez wyjątków).

Camel używa EndpointMessageListener, który w końcu wywołuje metodę procesu następnego procesora (lub producenta) w dół trasy. Ponieważ jest to klasyczny łańcuch obowiązków, jeśli dowolny procesor w dół trasy zgłasza wyjątek lub ustawia wyjątek na serwerze Exchange, zostanie ponownie zgłoszony przez EndpointMessageListener, uniemożliwiając komunikatowi AbstractMessageListener potwierdzenie.

+1

Dziękuję za uratowanie mojego czasu. – andrey