0

我想尝试一下 Apache Camel 断路器 ( 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);
        });

主要应用

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

我的期望:

到达带有 12 的 Message 时, foo 路由会抛出异常,并且 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休伯特

4

1 回答 1

1

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

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

要停止DefaultErrorHandler处理消息,您应该禁用路由使用的所有错误处理,或者您可以使用 global语句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");
于 2015-10-09T13:59:25.937 回答