【问题标题】:Apache Camel Circuit Breaker initially in open stateApache Camel 断路器最初处于打开状态
【发布时间】:2016-01-07 05:22:53
【问题描述】:

我想试用 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 休伯特

【问题讨论】:

    标签: java apache-camel integration circuit-breaker


    【解决方案1】:

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

    如果您从 "direct:foo" 路由中删除 .to("direct:pleaseHoldTheLine"),则断路器应按预期运行并在收到消息 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");
    

    【讨论】:

    • 嗨,理查德,谢谢您的回答。我试了一下,但也没有用。在第一个 HustException DefaultErrorHandler 介入并且 CamelContext 被停止。我的路线如下所示: from("direct:foo") .loadBalance().circuitBreaker(1, 5000, HustException.class) .to("direct:bar");我的意图是在第一次发生 HustException 时绕过 bar 路线几秒钟。
    猜你喜欢
    • 2018-07-01
    • 2020-08-29
    • 2015-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-21
    • 1970-01-01
    相关资源
    最近更新 更多