Apache Camel Circuit Breaker最初处于开放状态

时间:2015-10-09 09:56:37

标签: java apache-camel integration circuit-breaker

我想试用Apache Camel Circuit Breaker(http://camel.apache.org/load-balancer.html)模式。它不像我想的那样表现。

骆驼路由

我的路由看起来像这样

from("direct:foo")
        .loadBalance()
        .circuitBreaker(1, 5000, HustException.class).to("direct:pleaseHoldTheLine")
        .to("direct:bar");

from("direct:bar")
        .process(exchange -> {
            Integer value = exchange.getIn().getBody(Integer.class);
            System.out.println("[BAR] " + value);
            if (value.equals(12)) {
                throw new HustException();
            }
        });

from("direct:pleaseHoldTheLine")
        .process(exchange -> {
            Integer value = exchange.getIn().getBody(Integer.class);
            System.out.println("[PLEASE_HOLD_THE_LINE] " + value);
        });

主要申请

主应用程序使用Integer值从每秒0到99的foo路由触发消息。

我的期望:

在使用12来到消息时,foo路由会抛出一个exeption并且pleaseHoldTheLine路由应该介入.5秒后,foo路由再次被询问,如果没有异常发生,foo路由将再次处理。

会发生什么:

[PLEASE_HOLD_THE_LINE] 0
[PLEASE_HOLD_THE_LINE] 1
[PLEASE_HOLD_THE_LINE] 2
[PLEASE_HOLD_THE_LINE] 3
[PLEASE_HOLD_THE_LINE] 4
[PLEASE_HOLD_THE_LINE] 5
[PLEASE_HOLD_THE_LINE] 6
[PLEASE_HOLD_THE_LINE] 7
[PLEASE_HOLD_THE_LINE] 8
[PLEASE_HOLD_THE_LINE] 9
[PLEASE_HOLD_THE_LINE] 10
[PLEASE_HOLD_THE_LINE] 11
[PLEASE_HOLD_THE_LINE] 12
[PLEASE_HOLD_THE_LINE] 13
[PLEASE_HOLD_THE_LINE] 14
...
BW休伯特

1 个答案:

答案 0 :(得分:1)

Apache Camel circuitBreaker负载均衡器不会重定向流,它只会传递或拒绝消息。您问题中的路线始终会向"direct:pleaseHoldTheLine"路线发送消息。

如果从.to("direct:pleaseHoldTheLine")路由中删除"direct:foo",则断路器应按预期运行,并在收到消息12后拒绝消息。

要停止DefaultErrorHandler处理邮件,您应该使用errorHandler(noErrorHandler())禁用路由的所有错误处理,或者您可以使用全局onException(HustException.class).continued(true);指定要跳过的特定异常言。

您可以使用failover负载均衡器重定向流量,但如果您可以合并failovercircuitBreaker来获取您的行为,我就不清楚了想。

把这一切放在一起:

onException(HustException.class).continued(true);
from("direct:foo")
        .loadBalance()
        .circuitBreaker(1, 5000, HustException.class)
        .to("direct:bar");