- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个ErrorHandler
(DefaultErrorHandler
),其中已提供onRedelivery
引用。默认情况下,ErrorHandler
重试无限次。但是,如果存在某种条件(当前由onRedelivery
ref确定),我想退出重新交付循环并执行另一条路线。
我最初的想法是让onRedelivery
ref抛出异常,并使用适当的onException
将其定向到适当的路径。但是,我发现RedeliveryErrorHandler
捕获了此异常并保持循环。
我还发现,我可以将Exchange.REDELIVERY_EXHAUSTED
设置为true,这将退出重新交付循环,但不会将我定向到我的恢复路线。
有什么建议?Edit
因此,我发现,如果我将原始异常类型添加到我拥有onException
的RouteBuilder
中的异常类型的ErrorHandler
中,并且如果将Exchange.REDELIVERY_EXHAUSTED
设置为true,则原始异常将被抛出到RouteBuilder
范围并被捕获通过onException
。但是,我真的更喜欢抛出并捕获一个新的异常类型,以便这种情况下的处理是明确的。Answer
因此,建议使用Peter's
的retryWhile
很棒,因为它允许我以编程方式确定何时停止重试。它太。它只是半途而废。第二部分是将失败的交换发送到新的/不同的路由以进行错误处理。这是通过使用DeadLetterChannel
而不是DefaultErrorHandler
完成的。
最佳答案
结合使用retryWhile
和deadLetterChannel
:
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/
我是一名优秀的程序员,十分优秀!