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以查看是否处理了异常。