Java 驼峰幂等removeOnFailure仅适用于某些异常类型
考虑到这条简单的骆驼路线:Java 驼峰幂等removeOnFailure仅适用于某些异常类型,java,apache-camel,Java,Apache Camel,考虑到这条简单的骆驼路线: from("timer:some timer") .bean(someBeanThatProducesLists) .split(body()).parallelProcessing() . .idempotentConsumer(simple("${body.id}"), myIdempotentRepository) .bean(beamThatProcesses)
from("timer:some timer")
.bean(someBeanThatProducesLists)
.split(body()).parallelProcessing() .
.idempotentConsumer(simple("${body.id}"), myIdempotentRepository)
.bean(beamThatProcesses)
这是预期的工作。当处理的束中发生异常时,如果somebeanthatProductsLists
再次返回具有相同ID的条目,则会删除并重新处理密钥。
我想要的是
onException(MyCustomException.class)
.maximumRedeliveries(3)
并在重新传递耗尽后将ID保留在幂等存储库中,但仅针对此特定异常,因此removeOnFailure
在这里没有真正的帮助
我浏览了文档,还浏览了Camel In Action第二版v12,但找不到任何实现方法。我确实发现标记异常已处理
没有帮助
我可以将removeOnFailure
设置为false,然后使用自定义异常处理程序在大多数异常中删除它,并在重试次数用尽时保持自定义状态,但它很容易出错,因为幂等键必须在多个位置计算,异常可能发生在路由中的任何位置等
我想我可以在Beamthapprocess
中捕获异常并在那里处理它,但我希望有一种方法可以指导camel这样做 您可以对特定的onException
使用handled(true)
来告诉Camel它是正常的,因此幂等存储库将认为它是正常的,并执行提交,因此将id存储在存储库中
handled(true)
还可以接受一个谓词
,因此如果您需要更细粒度的控制是否处理,您可以计算true
或false
。我最终在我的幂等存储库中实现了类似的东西:
@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
}
}
谢谢你的快速回答,克劳斯,这是我的第一个假设,但是我看到了这个讨论和你的回答,让我有点不舒服。我有一个自定义的非事务幂等存储库,所以我只需要它不删除密钥,但我想这不会有什么区别。我测试了这个,它似乎是ExchangeIdempotentRepository。即使在处理异常时也会调用remove
。这不是一个干净的解决方案,但由于这是我自己的实现,我可以检查exchange以查看是否处理了异常。