Работя със система, управлявана от команди, използвайки JMS и Apache Camel за маршрутизиране. В следната ситуация:
Изпращам на системата команда заявка-отговор "X".
Системата получава "X" чрез трансакциониран камилски маршрут.
Докато обработва "X", системата изпраща няколко събития, "Y" и "Z", но като част от трансактирания маршрут те не трябва да се изчистват, докато транзакцията не приключи.
Възниква изключение по време на изпълнение - което трябва да доведе до връщане назад на транзакцията.
Искам да мога да прихвана изключението и да отговоря с истинско съобщение (а не изключение) на клиента. Като такъв започнах да прилагам манипулатор на грешки:
onException(RuntimeException.class)
.handled(true)
.markRollbackOnly()
.filter(header(Header.REPLY_TO.getName()).isNotNull())
.to(DESTINATION_FOR_EXCEPTION_HANDLING)
.to(DESTINATION_FOR_REPLIES);
Където:
- DESTINATION_FOR_EXCEPTION_HANDLING е компонент, който приема изключението и връща обект на съобщение
- DESTINATION_FOR_REPLIES е компонент, който задава изходящото тяло към обекта на съобщението
Проблемът, който имам, е, че ако включа "markRollbackOnly()", той:
- Предотвратява промиването на "Y" и "Z" - ДОБРЕ
- Предизвиква изключение за обмен на клиента, който прави requestReply - BAD
И ако не го включа, тогава:
- "Y" & "Z" се зачервяват - ЛОШО
- Получавам обекта на истинското съобщение на клиента - ДОБРЕ
Как мога да конфигурирам camel така, че да предотвратява изтриването на съобщения в транзакцията и все пак да мога да конвертирам изключението в обработено съобщение за грешка?