我想试用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休伯特
答案 0 :(得分: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");