Я новичок в Camel, и я стараюсь понять обработку ошибок/исключений в Apache Camel. Я хочу сделать следующее:Несколько обработчиков ошибок на верблюде
- Если какое-либо исключение происходит на маршруте, исходное сообщение следует переместить в специальный «каталог ошибок» для анализа.
- При возникновении каких-либо исключений, кроме того, сообщение об исключении должно быть авторизованы/отправить почту в
- При возникновении каких-либо исключений, кроме того, сообщение об исключении должно быть авторизованы/добавляется в файле журнала
Для 1.Я использовал DeadLetterChannel
и сохранил сообщение в папке. Это прекрасно работает.
Для 2. и 3. я хотел использовать LoggingErrorHandler
, который перемещает исключение ошибки в прямой маршрут, где я отправляю почту и добавляю файл регистрации. Но 2. и 3. не работает, я получаю в log4j
файле:
"Ошибка доставки для (MESSAGEID: [...]"
Вот мой код маршрутизации:
public void configure() {
errorHandler(deadLetterChannel("direct:moveFailedMessage").useOriginalMessage());
from("direct:moveFailedMessage").to(ftpErrorURI+ftpOptions);
//.to(sendMailURI); => this mail works, but here is orig. msg context
from("sql:select * from v_myView?dataSource=myDataSource")
.bean("orderSqlToJms")
.to(jmsURI+"?JmsMessageType=Object")
.bean("validate")
// this error handler don't work as i expect
.errorHandler(loggingErrorHandler("direct:logExceptionToMailAndFile"))
.to(ftpOutURI+ftpOptions);
from("direct:logExceptionToMailAndFile").to(sendMailURI).to(ftpErrorLogURI+ftpErrorOptions);
}
почта посыла работает в generell, когда я пытаюсь его в DeadLetterChannel
контексте, но ничего не работает в LoggingErrorHandler
контексте. является ли этот обработчик ограничивается контекстами, как log4j
? Если да, то какой обработчик должен это использовать? DefaultErrorHandler
отправляется обратно отправителю и здесь нет транзакции для TransactionErrorHandler
? Могу я, может быть, поймать сообщение об исключении внутри DeadLetterChannel
? Я не нашел подсказок, которые могли бы мне помочь, есть ли у кого-нибудь решение?
Я не хочу, чтобы поймать все Exeception явным образом по-другому, я хочу делать все вещи глобальными для всех видов исключений. Причина этого я не использовал onException()
. Маби, это неправильно?
Почему я получаю минус для этого вопроса? Если вы оставите комментарий, я могу улучшить свой вопрос.