Первоначально автоматический выключатель Apache Camel в разомкнутом состоянии

Я хотел попробовать 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);
        });

Основное приложение

Основное приложение запускает сообщения с целочисленными значениями от 0 до 99 каждую секунду на маршрут foo.

Что я ожидаю:

При переходе к сообщению с 12 маршрут 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
...

БВ Хьюберт


person Hubert Ströbitzer    schedule 09.10.2015    source источник


Ответы (1)


Балансировщик нагрузки Apache Camel circuitBreaker не перенаправляет поток, он только пропускает или отклоняет сообщения. Маршрут, указанный в вашем вопросе, всегда будет отправлять сообщения на маршрут "direct:pleaseHoldTheLine".

Если вы удалите .to("direct:pleaseHoldTheLine") из маршрута "direct:foo", прерыватель цепи должен работать должным образом и отклонять сообщения после получения сообщения 12.

Чтобы остановить обработку сообщения DefaultErrorHandler, вы должны либо отключить всю обработку ошибок для маршрута с помощью errorHandler(noErrorHandler()), либо указать определенные исключения, которые вы хотите пропустить, с помощью глобального оператора onException(HustException.class).continued(true);.

Вы можете использовать балансировщик нагрузки failover для перенаправления потока, но мне не ясно, можете ли вы комбинировать failover и circuitBreaker для получения желаемого поведения.

Соединяем все это вместе:

onException(HustException.class).continued(true);
from("direct:foo")
        .loadBalance()
        .circuitBreaker(1, 5000, HustException.class)
        .to("direct:bar");
person Richard Neish    schedule 09.10.2015
comment
Привет Ричард Спасибо за ваш ответ. Я попробовал, но это тоже не сработало. При первом исключении HustException вступает в действие DefaultErrorHandler, и CamelContext останавливается. Мой маршрут выглядит так: from(direct:foo) .loadBalance().circuitBreaker(1, 5000, HustException.class) .to(direct:bar); Я намерен обойти маршрут bar на несколько секунд при первом возникновении HustException. - person Hubert Ströbitzer; 09.10.2015