我想用重试和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)
有人知道为什么会这样吗?我可以在不拆分路线的情况下将两者结合起来吗?
答案 0 :(得分:0)
这可能对设计重试逻辑的其他人很有帮助。
骆驼有.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 <)来缩小重试逻辑以针对特定异常。 / p>
更新:完全错过了您的问题。我几乎用Java DSL编写了您使用XML所做的事情。忽略!!