Camel Idempotent removeOnFailure仅适用于某些异常类型

时间:2017-07-21 08:22:15

标签: java apache-camel

考虑这个简单的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中捕获异常并在那里处理它,但我希望有一种方法可以指示骆驼来做它。

2 个答案:

答案 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,因此如果您需要更细粒度的控制是否处理,您可以评估truefalse