版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Anbang713/article/details/85921443
通常情况下,我们在command里的getFallback()做降级处理。在getFallback()里,我们可以再套一个command作为第一级降级策略,而这个command的fallback就是第二级降级策略。下面我们直接通过代码来看下多级降级的实现。
一、创建command
public class CommandMultiLevelFallback extends HystrixCommand<String> {
private String tag;
public CommandMultiLevelFallback(String tag) {
super(HystrixCommandGroupKey.Factory.asKey("CommandMultiLevelFallback"));
this.tag = tag;
}
@Override
protected String run() throws Exception {
if ("error".equals(tag)) {
throw new Exception("CommandMultiLevelFallback执行失败,降级处理");
}
return "成功";
}
@Override
protected String getFallback() {
return new FirstLevelFallbackCommand(tag).execute();
}
private static class FirstLevelFallbackCommand extends HystrixCommand<String> {
private String tag;
public FirstLevelFallbackCommand(String tag) {
// 第一级的降级策略,因为这个command是运行在fallback中的
// 所以至关重要的一点是,在做多级降级的时候,要将降级command的线程池单独做一个出来
// 如果主流程的command都失败了,可能线程池都已经被占满了
// 降级command必须用自己的独立的线程池
super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("FirstLevelFallbackCommand")));
this.tag = tag;
}
@Override
protected String run() throws Exception {
if ("error".equals(tag)) {
throw new Exception("一级降级失败,二级降级处理");
}
return "成功";
}
@Override
protected String getFallback() {
// 第二级降级策略,第一级降级策略,都失败了。实际项目中,通常会在这里做残缺降级。
System.out.println("二级降级执行成功");
return "成功";
}
}
}
二、执行command
public class CommandMultiLevelFallbackTest {
public static void main(String[] args) {
CommandMultiLevelFallback multiLevelFallback = new CommandMultiLevelFallback("error");
multiLevelFallback.execute();
}
}
三、执行结果