使用 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)";
}