4

在官方https://spring.io/guides/gs/circuit-breaker/手册中有

  1. 业务方法(readingList)
  2. 后备方法(可靠)
@HystrixCommand(fallbackMethod = "reliable")
  public String readingList() {
    URI uri = URI.create("http://localhost:8090/recommended");

    return this.restTemplate.getForObject(uri, String.class);
  }

  public String reliable() {
    return "Cloud Native Java (O'Reilly)";
  }

如何将数据从业务方法传递到回退方法?使用 ThreadLocal、不可变集合、并发集合、任何想法/最佳实践?

4

1 回答 1

2

使用 ThreadLocal?

@HystrixCommand并且相应fallbackMethod的通常在单独的线程中(一起)执行,因为默认execution.isolation.strategy值为ExecutionIsolationStrategy.THREAD.

这意味着如果您在@HystrixCommand执行之前使用 ThreadLocal 设置任何变量,它们将不可用,@HystrixCommand因为线程会有所不同。

如果以上是必要的,您可以使用不同的隔离策略 - ExecutionIsolationStrategy.SEMAPHORE.

要覆盖默认隔离策略,您可以在 hystrix 命令定义(或属性文件)中执行此操作:

@HystrixCommand(fallbackMethod = "reliable",
    commandProperties = {
        @HystrixProperty(name="execution.isolation.strategy", value="SEMAPHORE")
    }
)

传递输入参数数据

带有注解的方法@HystrixCommand和对应的 fallbackMethod 需要具有相同的方法签名(加上用于抛出异常的 fallback 中的可选参数),因此 fallback 方法自然可以访问@HystrixCommand.

传递异常数据

在回退方法签名中添加 Throwable 将包括从 产生的异常@HystrixCommand

   public String reliable(Throwable t) {
     return "Cloud Native Java (O'Reilly)";
   }

传递执行数据

期望任何执行数据从 main 方法传递到 fallback 方法是不切实际的。你不知道 main 方法什么时候会失败。关键是要尝试定义更好的输入参数,这些参数无论如何都会与后备共享。

例如,在您给出的代码中,URL 可以成为输入参数,因此它也可用于回退方法:

@HystrixCommand(fallbackMethod = "reliable")
  public String readingList(String url) {
    URI uri = URI.create(url);

    return this.restTemplate.getForObject(uri, String.class);
  }

   public String reliable(String url, Throwable t) {
     return "Cloud Native Java (O'Reilly)";
   }
于 2019-04-25T19:24:04.197 回答