在达到 Camel 中的 maximumRedeliveries 阈值后执行任务

Execute task after reaching threshold for maximumRedeliveries in Camel

我已经使用 camel 重试在我的代码中实现了重试功能。它最多会重试五次。

onException(Exception.class)
    .maximumRedeliveries(5)
    .retryAttemptedLogLevel(LoggingLevel.WARN)
    .backOffMultiplier(5)
    .maximumRedeliveryDelay(5)
    .useExponentialBackOff();

现在我想在达到阈值时调用自定义方法而不是抛出异常。我怎样才能做到这一点?

您可以将 handled-flag 设置为 true,然后调用您的自定义 bean。

onException(Exception.class)
    .maximumRedeliveries(5)
    .retryAttemptedLogLevel(LoggingLevel.WARN)
    .backOffMultiplier(5)
    .maximumRedeliveryDelay(5)
    .useExponentialBackOff()
    .handled(true)
    .to("bean:myCustomBean");

这正是 Dead Letter Channel EIP pattern 的用例。我建议将您的 onException 块转换为 errorHandler 并使用 deadLetterChannel 构建器。

errorHandler(
        deadLetterChannel("direct:redeliveryExhausted")
                .maximumRedeliveries(5)
                .retryAttemptedLogLevel(LoggingLevel.WARN)
                .backOffMultiplier(5)
                .maximumRedeliveryDelay(5)
                .useExponentialBackOff()
);

from("direct:redeliveryExhausted")
        .log("I am going to handle non-deliverable message")
        .log("Because of this exception: ${exception}")
        .to("log:failed");