Я работаю с управляемой командами системой с использованием JMS и Apache Camel для маршрутизации. В следующей ситуации:Обработка ошибок исключений/ошибок Camel без возникновения исключения клиента
Я посылаю системе команду запроса-ответа «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" сбрасываться - BAD
- Я получаю подлинный объект сообщения на клиенте - ХОРОШО
Как настроить верблюд как для предотвращения промывки сообщений в транзакции, так и для того, чтобы преобразовать исключение в обработанное сообщение об ошибке?
бы, не все еще вызывает исключение на клиенте, поскольку исходный компонент все равно будет реагировать на исключение обмена? – James