Я работаю с системой, управляемой командными событиями, с использованием 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 - это bean-компонент, который принимает исключение и возвращает объект сообщения
- DESTINATION_FOR_REPLIES - это bean-компонент, который устанавливает тело вывода для объекта сообщения.
У меня проблема в том, что если я включу «markRollbackOnly ()», это:
- Предотвращает смывание "Y" и "Z" - ХОРОШО
- Вызывает исключение обмена на клиенте, выполняющем запрос Ответ - ПЛОХО
И если я его не включаю, то:
- "Y" и "Z" покраснели - ПЛОХО
- Я получаю подлинный объект сообщения на клиенте - ХОРОШО
Как я могу настроить верблюда, чтобы предотвратить сброс сообщений в транзакции и при этом иметь возможность преобразовать исключение в обработанное сообщение об ошибке?