https://spring.io/guides/gs/circuit-breaker/官方手册中有
org.springframework.boot.web.embedded.jetty.JettyServletWebServerFactory
如何将数据从业务方法传递到后备方法?使用ThreadLocal,不可变集合,并发集合,任何想法/最佳实践?
答案 0 :(得分:0)
使用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方法自然可以访问{{ 1}}。
在后备方法签名中添加Throwable将包括@HystrixCommand
产生的异常:
@HystrixCommand
期望将任何执行数据从main方法传递到fallback方法是不切实际的。您不知道main方法何时会失败。 关键是尝试定义更好的输入参数,无论如何这些参数都将与后备共享。
例如,在您提供的代码中,URL可以成为输入参数,因此回退方法也可以使用它:
public String reliable(Throwable t) {
return "Cloud Native Java (O'Reilly)";
}