java - 如何正确处理 Hystrix 回退中的预期错误?

标签 java spring-boot spring-cloud hystrix

我们有一个 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 抛出异常“有效”,但 Hystrix 会警告我们:

CommandKey failed and fallback failed.

即它会将此解释为回退失败。在我们的例子中,异常应该被解释为回退失败,而应该被解释为预期的行为。我们还尝试将抛出的异常包装在 HystrixBadRequestException 中,但它似乎不适用于回退(根据 docs 这适用于“run”方法)。

如何在 Hystrix 中实现一个抛出异常的回退方法?我们可以安全地忽略警告,还是 Hystrix 不是以这种方式设计的?

最佳答案

如果您不想使用它,为什么还要设置后备呢? Hystrix 不需要你设置一个。当您宁愿从缓存中返回陈旧数据之类的东西而不是抛出异常时,就会使用回退。这两种情况都算作 Hystrix 的失败。如果你要从 fallback 方法中抛出异常,你只会让 Hystrix 感到困惑,它会认为除了服务本身之外,你的 fallback 也有错误。如果您不提供回退,Hystrix 应该抛出一个 HystrixBadRequestException 来包装从您的 findXs 方法抛出的异常。

关于java - 如何正确处理 Hystrix 回退中的预期错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35413476/

相关文章:

java - 测试期间 spring webflux 中的全局异常处理

带有 apache Axis 的 Spring 启动应用程序

java - 依赖项 org.json :json:jar is missing

java - 如何将 Apache ZooKeeper 与 Spring Cloud 服务发现和负载均衡结合使用?

java - rabbitmq Binder 中的自定义 DLX 选项

java - InitialContext 在尝试查找时抛出异常

java - ArrayList 可以在多线程环境中用于只读目的吗?

spring-cloud - 如何使用应用程序名称替换 ip :port about spring cloud eureka?

java - Hibernate实体 'patch'/部分更新

java - 如何在java dsl中设置消息驱动的入站适配器的恢复间隔?