0

Я новичок в Camel, и я стараюсь понять обработку ошибок/исключений в Apache Camel. Я хочу сделать следующее:Несколько обработчиков ошибок на верблюде

  1. Если какое-либо исключение происходит на маршруте, исходное сообщение следует переместить в специальный «каталог ошибок» для анализа.
  2. При возникновении каких-либо исключений, кроме того, сообщение об исключении должно быть авторизованы/отправить почту в
  3. При возникновении каких-либо исключений, кроме того, сообщение об исключении должно быть авторизованы/добавляется в файле журнала

Для 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(). Маби, это неправильно?

Почему я получаю минус для этого вопроса? Если вы оставите комментарий, я могу улучшить свой вопрос.

ответ

0

Вот решение, которое работает для меня:

errorHandler(deadLetterChannel("direct:moveFailedMessage").useOriginalMessage()); 
from("direct:moveFailedMessage").to(ftpErrorURI+ftpOptions).process(new Processor() { 
    public void process(Exchange exchange) throws Exception { 
     Exception cause = exchange.getProperty(Exchange.EXCEPTION_CAUGHT, Exception.class); 
     exchange.getIn().setBody(cause.getMessage()); 
    } 
}).to(sendMailURI).to(ftpErrorLogURI+ftpErrorOptions); 

Я все маршрут к deadLetterChannel с исходным сообщением. Сначала я пишу исходное сообщение, которое выбрало Exception, в файл. После этого я извлекаю сообщение об исключении в процессоре и заменяю исходное сообщение сообщением об исключении и маршрутизирую его затем в почту и файл журнала.

Моя проблема была в том, что я не знал, что могу получить сообщение об исключении с Exchange.EXCEPTION_CAUGHT. Может быть, это тоже поможет кому-то.

Смежные вопросы