【发布时间】:2016-05-26 14:32:15
【问题描述】:
我们有一个如下所示的 Hystrix (1.4.x) 命令(使用 Spring):
@HystrixCommand(groupKey = "GroupKey", commandKey = "CommandKey", fallbackMethod = "myFallback")
public List<X> findXs(long xId) {
return externalService.findXsExternally(xId);
}
我们实际上不想从回退方法返回一个(空的)List,而是抛出一个异常,以便findXs 的调用者知道externalService 已关闭并可以采取相应的措施。但同时我们想利用 Hystrix 提供的功能。
在我们的例子中,我们希望调用者返回错误消息而不是返回列表。在 Spring 中,回退是这样实现的:
public List<X> myFallback(long xId) {
// What to do?? Throw exception!?
}
从myFallback "works" 抛出异常,但 Hystrix 会警告我们:
CommandKey 失败,回退失败。
即它将将此解释为后备失败。在我们的例子中,异常应该不被解释为回退失败,而应该被解释为预期的行为。我们还尝试将抛出的异常包装在 HystrixBadRequestException 中,但它似乎不适用于回退(根据 docs,这适用于“运行”方法)。
如何在 Hystrix 中实现抛出异常的回退方法?我们可以安全地忽略警告还是 Hystrix 不是这样设计的?
【问题讨论】:
标签: java spring-boot spring-cloud hystrix