我使用故障转移负载平衡器定义了驼峰路由,如下所示:
from(activemq:foo)
.errorHandler(deadLetterChannel(activemq:foo.dlq).onPrepareFailure(failureProcessor))
.process(processor)
.loadBalance()
.failover(2, true, true)
.to(activemq:queue1, activemq:queue2)
.end();
使用上面定义的路由,如果传递到queue1失败,异常将由错误处理程序处理,消息将直接放入foo.dlq,而负载平衡器不会故障转移到下一个目标。
如何定义路线:
它应该故障转移到所有路由,如果传递到所有路由失败(完全失败),它应该将控制发送到错误处理程序,错误处理程序应该将消息放入dlq。
2条答案
按热度按时间pgx2nnw81#
我想你应该转身
inheritErrorHandler
(第2个参数)在负载平衡器中关闭,即:这样,两个节点之一的任何故障都会传播到loadbalancer处理器,而不是dlq。
但是如果整个负载平衡过程失败(即:如果两个节点都失败),dlq将被踢入。
提示:如果缩进代码,传播逻辑会更清晰一些:
您有两个识别级别;每个级别都有自己的错误处理:
级别2的错误由负载平衡器管理
级别1的错误由dlq管理
gudnpqoy2#
我很惊讶。我刚刚使用两个虚拟http端点运行了以下测试(在camel 3.9中):
下面是输出:
您可以清楚地看到,每个节点上都有一次尝试,并且交换最终转到dlq
如果启用inheriterrorhandler,输出现在是: