gpt4 book ai didi

error-handling - 从onRedelivery触发新的onException路由

转载 作者:行者123 更新时间:2023-12-03 08:30:56 25 4
gpt4 key购买 nike

我有一个ErrorHandler(DefaultErrorHandler),其中已提供onRedelivery引用。默认情况下,ErrorHandler重试无限次。但是,如果存在某种条件(当前由onRedelivery ref确定),我想退出重新交付循环并执行另一条路线。

我最初的想法是让onRedelivery ref抛出异常,并使用适当的onException将其定向到适当的路径。但是,我发现RedeliveryErrorHandler捕获了此异常并保持循环。

我还发现,我可以将Exchange.REDELIVERY_EXHAUSTED设置为true,这将退出重新交付循环,但不会将我定向到我的恢复路线。

有什么建议?
Edit
因此,我发现,如果我将原始异常类型添加到我拥有onExceptionRouteBuilder中的异常类型的ErrorHandler中,并且如果将Exchange.REDELIVERY_EXHAUSTED设置为true,则原始异常将被抛出到RouteBuilder范围并被捕获通过onException。但是,我真的更喜欢抛出并捕获一个新的异常类型,以便这种情况下的处理是明确的。
Answer
因此,建议使用Peter'sretryWhile很棒,因为它允许我以编程方式确定何时停止重试。它太。它只是半途而废。第二部分是将失败的交换发送到新的/不同的路由以进行错误处理。这是通过使用DeadLetterChannel而不是DefaultErrorHandler完成的。

最佳答案

结合使用retryWhiledeadLetterChannel:

public class MyRouteBuilder extends RouteBuilder {
@Override
public void configure() {
errorHandler(deadLetterChannel("direct:special")
.retryWhile(method(new MyPredicate())));

from("direct:start")
.log("Starting...")
.throwException(new Exception("dummy"));

from("direct:special")
.log("...Special");
}
}

public class MyPredicate implements Predicate {
@Override
public boolean matches(final Exchange exchange) {
AtomicInteger counter = exchange.getProperty("myCounter");
if (counter == null) {
counter = new AtomicInteger(0);
exchange.setProperty("myCounter", counter);
}
int count = counter.incrementAndGet();
LOG.info("Count = {}", count);
return count < 3; // or whatever condition is suitable
}
}

打印:
INFO  Starting...
INFO Count = 1
INFO Count = 2
INFO Count = 3
INFO ...Special

关于error-handling - 从onRedelivery触发新的onException路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24210304/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com