hystrix源码解析——FallbackMethod是如何接收异常的

本文详细解析了Hystrix中何时触发fallbackMethod,哪些异常不会触发,以及如何接收和处理异常。重点介绍了异常不触发的情况,如忽略的异常、特定系统异常,以及fallbackMethod接收异常的两种情况。通过源码分析,揭示了从执行主函数到调用回调函数的整个流程,包括异常处理的细节。
摘要由CSDN通过智能技术生成

一、何时触发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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值