如何在 Apache Camel 中结合 Redelivery policy 和 Hystrix 断路器?

Posted

技术标签:

【中文标题】如何在 Apache Camel 中结合 Redelivery policy 和 Hystrix 断路器?【英文标题】:How to combine Redelivery policy and Hystrix circuit breaker in Apache Camel? 【发布时间】:2017-08-16 13:42:27 【问题描述】:

我想用重试和 Hystrix 断路器实现 Apache Camel 路由。我的路线如下所示:

<route>
......
  <onException>
        <exception>java.lang.Exception</exception>
        <redeliveryPolicy  redeliveryDelay="150" maximumRedeliveries="3" logRetryAttempted="true" retryAttemptedLogLevel="WARN"/>
  </onException>
  <hystrix>
        <hystrixConfiguration id="MyServiceHystrix" />
        <to uri="my.service.endpoint?bridgeEndpoint=true"/>
  </hystrix>
</route>

Hystrix命令线程内部调用camel http4端点时,CamelInternalProcessor不会调用RedeliveryErrorHandler,也不会重试。 基本上堆栈跟踪尊重是:

at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:542)
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:197)
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:120)
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:83)
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:197)
    at org.apache.camel.component.direct.DirectProducer.process(DirectProducer.java:62)
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:120)
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:83)

有人知道为什么会这样吗?我可以在不拆分路线的情况下将两者结合起来吗?

【问题讨论】:

【参考方案1】:

这可能有助于其他人设计重试逻辑。

骆驼有.circuitBreaker().inheritErrorHandler(true),但这不再起作用了。 (https://camel.apache.org/manual/latest/hystrix-eip.html),.loadbalancer().circuitBreaker() 也已弃用。粘贴代码库。

/** @deprecated */
@Deprecated
public LoadBalanceDefinition circuitBreaker(int threshold, long halfOpenAfter, Class<?>... exceptions)

但是,我们可以添加下面的行以在出现异常时重试。

onException(Exception.class)
.maximumRedeliveries(5) //No of times
.redeliveryDelay(1000); //Delay between retries in ms.

在上面的示例中,它将重试所有异常,但是,我们可以通过将 Exception.class 替换为您的程序所针对的对象(例如 NullPointerException.class 或 MyCustomException.class)来缩小重试逻辑以针对特定异常

更新:完全错过了你的问题。我几乎用 Java DSL 写了你使用 XML 所做的事情。无视!!

【讨论】:

以上是关于如何在 Apache Camel 中结合 Redelivery policy 和 Hystrix 断路器?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Apache Camel Aggregator关联中加入多个标头

如何在apache camel DSL或camel Processor内部设置其他身份验证属性?

如何在 Apache Camel 中定义要通过 ref 抛出的异常

Apache Camel:如何存储变量以供以后使用

如何在 Apache Camel 中检测损坏/恢复的 JMS 连接?

如何在 apache camel 中执行 gcp pubsub 消息的并行处理