Как совместить политику повторной доставки и автоматический выключатель Hystrix в Apache Camel?

Я хотел бы реализовать маршрут Apache Camel с повторной попыткой и автоматическим выключателем Hystrix. Мой маршрут выглядит так:

<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>

Когда конечная точка верблюда http4 вызывается внутри командного потока Hystrix, 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)

Кто-нибудь знает, почему это происходит? Могу ли я объединить оба, не разделяя маршрут?


person Anton Krosnev    schedule 23.03.2017    source источник


Ответы (1)


Это может быть полезно для других при разработке логики повторных попыток.

У Camel был .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. Игнорировать!!

person MMR    schedule 03.01.2020