【发布时间】:2014-03-28 17:03:29
【问题描述】:
我在 Camel 中有一条路线,我想在发生异常时重试,但我想设置一个属性,以便该路线第二次可以做一些稍微不同的事情,以尝试阻止在重试时再次发生错误。这是一条说明我目前正在尝试的想法的路线。
from("direct:onExceptionTest")
.onException(Exception.class)
.maximumRedeliveries(1)
.log("Retrying")
.setProperty("retrying", constant(true))
.end()
.log("Start")
.choice()
.when(property("retrying").isNull())
.log("Throwing")
.throwException(new Exception("Hello world"))
.end()
.end()
.log("Done")
显然这不是真正的路线;整个choice 正文只是在某些情况下模拟我的组件错误。我希望看到记录以下消息:
Start
Throwing
Retrying
Start
Done
但我实际看到的是:
Start
Throwing
Retrying
Failed delivery for (MessageId: ... on ExchangeId: ...). Exhausted after delivery attempt: 2 caught: java.lang.Exception: Hello world. Processed by failure processor: FatalFallbackErrorHandler[Pipeline[[Channel[Log(onExceptionTest)[Retrying]], Channel[setProperty(retrying, true)]]]]
我已经尝试将handled(true) 添加到异常处理程序中,但这所做的只是抑制错误消息。我没有看到第二条 Start 或 Done 日志消息。
为什么我的路线没有按照我的预期运行,我需要做什么才能让它按照我想要的方式运行?
更新
@ProgrammerDan 指出问题在于重新交付不是为了我想要实现的目标,这可以解释为什么我的路线不起作用!所以我需要在我的处理程序中完成这项工作,但是我的路由调用了一个 Web 服务并且还有一些其他步骤,我不想在处理程序中复制所有这些。我想出了这个,它按预期工作,但它涉及从一开始就再次调用自身的路由。这是一个坏主意吗?我会用这种方法让自己陷入困境吗?
from("direct:onExceptionTest")
.onException(Exception.class)
.onWhen(property("retrying").isNull()) // don't retry forever
.log("Retrying")
.setProperty("retrying", constant(true))
.handled(true)
.to("direct:onExceptionTest") // is recursion bad?
.end()
.log("Start")
.choice()
.when(property("retrying").isNull())
.log("Throwing")
.throwException(new Exception("Hello world"))
.end()
.end()
.log("Done")
【问题讨论】:
-
我猜,
doTry/doCatch对于大多数程序员来说更明确和更常见,递归可能会被稍微监督。
标签: apache-camel