我们能否在Apache骆驼中同时使用<circuitbreaker>和<failover>

时间:2019-05-24 08:23:00

标签: apache-camel

我需要以故障转移+循环方式将消息发送到两个后端IBM MQ,但是我发现,如果一个IBM MQ失败,骆驼仍然会为每个入站消息尝试失败的端点,这会降低全过程。

我尝试结合使用断路器,但骆驼不允许与一起使用。

我如何要求骆驼在特定时间段内不要尝试出现故障的端点?

1 个答案:

答案 0 :(得分:0)

带有error handlerexception clause

例如(java DSL),假设您将要处理的异常包装在MyDelayedRetryableException中:

onException(MyDelayedRetryableException.class)
    .useOriginalMessage()
    .redeliveryDelay(1000) \\ wait 1 second before retry
    .backOffMultiplier(2.0) \\every retry wait last delay multiplied this value (1000, 2000, 4000,...)
    .maximumRedeliveries(100) \\ attempts before giving up
    .retryAttemptedLogLevel(LoggingLevel.WARN)
    .useExponentialBackOff();

以上示例适用于所有路由,您还可以指定每个路由的错误处理。可以使用多种方法来完成您要问的事情,例如,在上面的示例中,您可以使其通用,并使用onExceptionOccurred部分插入一些逻辑:

.onExceptionOccurred(
    exchange -> {
        //extra logic, like accessing the exchange headers
        log.error(exchange.getException() == null ? "no message" : exchange.getException().getMessage());
    }
)

有关更多信息,请参见https://camel.apache.org/error-handling-in-camel.html