在官方的https://spring.io/guides/gs/circuit-breaker/手册中有
@HystrixCommand(fallbackMethod =“可靠”)公共字符串readingList() { URI uri = URI.create("http://localhost:8090/recommended");返回this.restTemplate.getForObject(uri,String.class);}公共字符串可靠(){返回"Cloud (O‘’Reilly)“};
如何将数据从业务方法传递到回退方法?使用ThreadLocal、不可变集合、并发集合、任何想法/最佳实践?
发布于 2019-04-25 19:24:04
用ThreadLocal?
@HystrixCommand
和相应的fallbackMethod
通常在一个单独的线程中执行,因为默认的execution.isolation.strategy
是ExecutionIsolationStrategy.THREAD
。
这意味着,如果在执行ThreadLocal之前使用@HystrixCommand
设置任何变量,则这些变量将不可用于@HystrixCommand
,因为线程将是不同的。
如果有必要,您可以使用不同的隔离策略- ExecutionIsolationStrategy.SEMAPHORE
。
若要覆盖默认隔离策略,可以在hystrix命令定义(或在属性文件中)上这样做:
@HystrixCommand(fallbackMethod = "reliable",
commandProperties = {
@HystrixProperty(name="execution.isolation.strategy", value="SEMAPHORE")
}
)
传递输入参数数据
带有@HystrixCommand
注解的方法和相应的fallbackMethod需要具有相同的方法签名(在抛出的异常回退中加上可选的param ),因此回退方法自然可以访问@HystrixCommand
的所有输入参数。
传递异常数据
在回退方法签名中添加Throwable将包括从@HystrixCommand
生成的异常
public String reliable(Throwable t) {
return "Cloud Native Java (O'Reilly)";
}
传递执行数据
期望从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)";
}
https://stackoverflow.com/questions/52382160
复制相似问题