一、何时触发fallbackMethod
FAILURE:执行失败,抛出异常。
TIMEOUT:执行超时。
SHORT_CIRCUITED:断路器打开。
THREAD_POOL_REJECTED:线程池拒绝。
SEMAPHORE_REJECTED:信号量拒绝。
注意:并不是所有的异常都会触发fallbackMethod,下面的这些异常或其子类会直接抛出
1. @HystrixCommand中定义的被忽略的异常ignoreExceptions,会被封装在HystrixBadRequestException中抛出
HystrixBadRequestException
2. 继承了ExceptionNotWrappedByHystrix的异常
ExceptionNotWrappedByHystrix
3. 无法恢复的系统异常
StackOverflowError
VirtualMachineError
ThreadDeath
LinkageError
二、如何接收异常
1. fallbackMethod不接收异常
@Service
public class HelloService {
@Autowired
RestTemplate restTemplate;
@HystrixCommand(fallbackMethod = "hiError")
public String hiService(String name) {
return restTemplate.getForObject("http://SERVICE-HI/hi?name="+name,String.class);
}
public String hiError(String name) {
return "hi,"+name+",sorry,error!";
}
}
2. fallbackMethod接收异常
@Service
public class HelloService {
@Autowired
RestTemplate restTemplate;
@HystrixCommand(fallbackMethod = "hiError")
public String hiService(String name) {
return restTemplate.getForObject("http://SERVICE-HI/hi?name="+name,String.class);
}
public String hiError(String name, Throwable exception) {
return "hi,"+name+",sorry,error: " + exception.getMessage();
}
}
三、源码解析
1. 执行主函数,如果失败的话调用回调函数
abstract class AbstractCommand<R> implements HystrixInvokableInfo<R>, HystrixObservable<R> {
...
/**
* This decorates "Hystrix" functionality around the run() Observable.
*
* @return R
*/
private Observable<R> executeCommandAndObserve(final AbstractCommand<R> _cmd) {
final HystrixRequestContext currentRequestContext = HystrixRequestContext.getContextForCurrentThread();
final Action1<R> markEmits = new Action1<R>() {
@Override
public void call(R r) {
if (shouldOutputOnNextEvents()) {
executionResult = executionResult.addEvent(HystrixEventType.EMIT);
eventNotifier.markEvent(HystrixEventType.EMIT, commandKey);
}
if (commandIsScalar()) {
long latency = System.currentTimeMillis() - executionResult.getStartTimestamp();
eventNotifier.markCommandExecution(getCommandKey(), properties.executionIsolationStrategy().get(), (int) latency, executionResult.getOrderedList());
eventNotifier.markEvent(HystrixEventType.SUCCESS, commandKey);
executionResult = executionResult.addEvent((int) latency, HystrixEventType.SUCCESS);
circuitBreaker.markSuccess();
}
}
};
final Action0 markOnCompleted = new Action0() {
@Override
public void call() {
if (!commandIsScalar()) {
long latency = System.currentTimeMillis() - executionResult.getStartTimestamp();
eventNotifier.markCommandExecution(getCommandKey(), properties.executionIsolationStrategy().get(), (int) latency, executionResult.getOrderedList());
eventNotifier.markEvent(HystrixEventType.SUCCESS, commandKey);
executionResult = executionResult.addEvent((int) latency, HystrixEventType.SUCCESS);
circuitBreaker.markSuccess();
}
}
};
//如果失败的话,调用回调函数
final Func1<Throwable, Observable<R>> handleFallback = new Func1<Throwable