考虑这个简单的Camel路线:
from("timer:some timer")
.bean(someBeanThatProducesLists)
.split(body()).parallelProcessing() .
.idempotentConsumer(simple("${body.id}"), myIdempotentRepository)
.bean(beamThatProcesses)
这是按预期工作的。当beamThatProcesses
中发生异常时,如果someBeanThatProducesLists
再次返回具有相同ID的条目,则该密钥将被删除并重新处理。
我想要的是
onException(MyCustomException.class)
.maximumRedeliveries(3)
在重新发送完成后,将ID保留在幂等存储库中,但仅针对此特定异常,因此removeOnFailure
在此处并非真正有用。
我浏览了文档以及Camel In Action第二版v12,但找不到任何实现方法。我确实发现标记异常handled
无效。
我可以将removeOnFailure
设置为false,然后让自定义异常处理程序在大多数异常情况下将其删除,并在重试耗尽时将其保留为自定义,但由于幂等密钥必须使用它,因此容易出错在多个地方计算,例外可以发生在路线等任何地方。
我想我可以在beamThatProcesses
中捕获异常并在那里处理它,但我希望有一种方法可以指示骆驼来做它。
答案 0 :(得分:0)
我最终在我的幂等存储库中实现了类似的东西:
@Override
public boolean remove(Exchange exchange, Object key) {
Throwable caught = exchange.getProperty(Exchange.EXCEPTION_CAUGHT, Throwable.class);
if (exchange.getException() == null && caught != null) {
logger.info("Exception was handled, not removing key");
return false;
} else {
// ... remove the message
}
}
答案 1 :(得分:-1)
您可以将handled(true)
用于特定的onException
告诉Camel它没问题,因此幂等存储库会将其视为正常并执行提交,从而将ID存储在存储库中。
handled(true)
也可以接受Predicate
,因此如果您需要更细粒度的控制是否处理,您可以评估true
或false
。