Camel SFTP Producer повторяет попытку для определенного типа ошибок - PullRequest
2 голосов
/ 03 апреля 2019

У нас было требование повторить определенное количество раз с задержкой для верблюжьего Производителя SFTP в случае ошибок. Используя maximumReconnectAttempts вместе с reconnectDelay, верблюд пытается повторить попытку для всех типов ошибок, но хочет повторить попытку только для определенного типа ошибок, таких как socketException или connectionexception или jschExceptions, и избежать повторных попыток для исключений аутентификации. Вот пример кода, который мы используем для этого. Как мы можем настроить, чтобы повторить только определенный тип ошибок и не все?

from("file:///test/dummy/moveFailed=error&antInclude=*.txt&initialDelay=60000").routeId("test")
.log(LoggingLevel.DEBUG, " Message sending to Destination")
.setHeader(Exchange.FILE_NAME, simple("Test${date:now:yyyyMMdd}.CSV"))
.to("sftp://username@host/destinationpassword=password123&reconnectDelay=3000&maximumReconnectAttempts=5")
.log(LoggingLevel.INFO,"event=${in.header.event} || File successfully transmitted to Destination")
.end();

1 Ответ

0 голосов
/ 01 мая 2019

, если вы хотите контролировать поведение для каждого исключения, вы можете сделать следующее:

onException(MyRetryableServiceException.class)
    .useOriginalMessage()
    .redeliveryDelay(1000)
    .backOffMultiplier(1.5)
    .maximumRedeliveries(3)
    .retryAttemptedLogLevel(LoggingLevel.WARN)
    .useExponentialBackOff();

Когда выдается MyRetryableServiceException, сообщение будет доставлено согласно maximumRedeliveries. Вы можете определить несколько onException или обернуть те, которые хотите повторить, в одно исключение ...

Это имеет приоритет над обработчиком ошибок по умолчанию, см. исключение-условие и обработка ошибок верблюда

Все остальное будет идти к ошибке по умолчанию, которая будет повторять все виды исключений ( до верблюда 2.x, без повторных попыток с версией> = 2.0 ). Если вы не переопределите это.

Итак, одним из возможных решений является определение OnException для пропуска повторных попыток при ошибках аутентификации и оставить обработчик ошибок по умолчанию для повторной попытки других, если вы используете верблюд <2.0 </p>

Вы можете отключить обработчик ошибок по умолчанию с помощью noErrorHandler(); или настроить его, например:

errorHandler(
    deadLetterChannel("seda:errors")
    .logNewException(true)
    .log("Unable to process ${body}")
    .maximumRedeliveries(1)
    .retryAttemptedLogLevel(LoggingLevel.WARN)
    .useExponentialBackOff()
);
...