Агрегировать после исключения от потребителя ftp: FatalFallbackErrorHandler - PullRequest
0 голосов
/ 15 марта 2019

Мой верблюжий маршрут пытается забрать некоторые файлы из sftp, передать их в сеть и удалить их из sftp.Если sftp недоступен после 3 попыток, я хочу, чтобы маршрут отправлял электронное письмо с предупреждением администратора о проблеме.

По этой причине мой адрес sftp имеет следующие параметры:

maximumReconnectAttempts=2&throwExceptionOnConnectFailed=true&consumer.bridgeErrorHandler=true

Если местоположение в сети недоступно, я хочу, чтобы маршрут уведомлял администратора, а не удалял файлы из sftp.По этой причине я установил .handled (false) в onException.

Однако при сбое подключения к sftp агрегирование также завершается неудачно, и сообщения электронной почты не поступают.Я сделал минималистский пример ниже:

/configure
  onException(Throwable.class)
    .retryAttemptedLogLevel(LoggingLevel.WARN)
    .redeliveryDelay(1000)
    .handled(false)
    .log(LoggingLevel.ERROR, LOG, "XXX - Error moving files")
    .to(AGGREGATEROUTE)
    .end();

  from(downloadFrom)
  .to(to)
  .log(LoggingLevel.INFO, LOG, "XXX - Moving file OK")
  .to(AGGREGATEROUTE);

  from(AGGREGATEROUTE)
  .log(LoggingLevel.INFO, LOG, "XXX - Starting aggregation.")
  .aggregate(constant(true), new GroupedExchangeAggregationStrategy())
      .completionFromBatchConsumer()
      .completionTimeout(10000)
  .log(LoggingLevel.INFO, LOG, "XXX - Aggregation completed, sending mail.");

В журналах я вижу:

16:02| ERROR | CamelLogger.java 156 | XXX - Error moving files

Затем журналы для исключения, возникающего во время соединения.

И затемэто:

16:02| ERROR | FatalFallbackErrorHandler.java 174 | Exception occurred while trying to handle previously thrown exception on exchangeId: ID-LP0641-1552662095664-0-2 using: [Pipeline[[Channel[Log(proefjes.camel_cursus.routebuilders.MoveWithPickupExceptions)[XXX - Error moving files]], Channel[sendTo(direct://aggregate)]]]].
16:02| ERROR | FatalFallbackErrorHandler.java 172 | \--> New exception on exchangeId: ID-LP0641-1552662095664-0-2
   org.apache.camel.component.file.GenericFileOperationFailedException: Cannot connect to sftp://user@mycompany.nl:22
    at org.apache.camel.component.file.remote.SftpOperations.connect(SftpOperations.java:149)

Я не вижу «XXX - Начало агрегации».который я ожидал увидеть в журнале.Возникает ли какая-то ошибка перед агрегацией?Точка останова для агрегата (*, *) никогда не достигается.

Ответы [ 2 ]

0 голосов
/ 22 марта 2019

Поскольку обработка ошибок различается в зависимости от того, какая конечная точка вызывает ошибку, я решил эту проблему с помощью двух разных версий onException:

     //configure exception on sft end
    onException(Throwable.class)
    .maximumRedeliveries(2)
    .retryAttemptedLogLevel(LoggingLevel.WARN)
    .redeliveryDelay(1000)
    .onWhen(new hasSFTPErrorPredicate())
     // .continued(true) //  tries to connect once, mails and continues to aggregation with empty exchange
    //.handled(false) // tries to connect twice but does not reach mail
      .handled(true)  // tries to connect once, does reach mail
    // handled not defined: tries to connect twice but does not reach mail
      .log(LoggingLevel.INFO, LOG, "XXX - SFTP exception")
      .to(MAIL_ROUTE)
      .end();

   // exception anywhere else
    onException(Throwable.class)
     .maximumRedeliveries(2)
     .retryAttemptedLogLevel(LoggingLevel.WARN)
     .redeliveryDelay(1000)
     .log(LoggingLevel.ERROR, LOG, "XXX - Error moving file ${file:name}: ${exception}")
     .to(AGGREGATEROUTE)
     .handled(false)
     .end();

Исключения, возникающие в конце sftp, обрабатываются в первом onException, посколькутам hasSFTPErrorPredicate возвращает true.Все, что делает этот предикат, проверяет, есть ли в сообщении исключение или их причина «Не удается подключиться к sftp:».В этом случае откат не требуется, поскольку ничего еще не произошло.

Любое другое исключение обрабатывается вторым исключением onException.

0 голосов
/ 15 марта 2019

Во-первых, я просто хочу кое-что прояснить.Вы пишете «В случае, если местоположение в сети недоступно, я хочу, чтобы маршрут уведомлял администратора и не удалял файлы из sftp», но разве это не должно быть очевидно в любом случае?Я имею в виду, если сетевое расположение недоступно, не будет ли невозможно удалить файлы из sftp?

Немного запутано, что ваш обработчик исключений также маршрутизирует .to(AGGREGATEROUTE).Учитывая, что вы хотите отправить электронное письмо администратору, разве это не должно быть в обработчике исключений, а не в счастливом пути?Зачем вам и как бы вы «агрегировали» сбой соединения?

Наконец, и здесь я думаю, что это реальная проблема с вашей реализацией, вы, возможно, неправильно поняли, что делает handled(false).Установка в false означает, что маршрутизация должна остановиться и распространить исключение, возвращаемое вызывающей стороне.Я не уверен, что делать с .to(AGGREGATEROUTE) в этом случае, но я не удивлен, что его не называют.

Я предлагаю попробовать несколько вещей.У меня нет вашего кода, поэтому я не уверен, какой из них будет работать лучше.Все они связаны и могут работать:

  • Измените handled(false) на handled(true).
  • Замените handled на continued(true).
  • ИспользуйтеКанал мертвой буквы.

Ссылка:

...