核心接口Retry实现DefaultRetry
直接看doExecute方法
1.判断重试属性retryProperties是否是active
2.如果是active,开启cat的事务
3.执行onOpen,也就是循环所有的retryListeners,打开监听器
4.调用canRetry判断当前能否重试,调用properties的canRetry
5.先看下retryOnException,判断抛出的exception是否可以重试
5.1 如果是第一次重试,以前没有抛出的异常,就直接返回true,代表这次可以重试
5.2 如果不是第一次,就获取对应的class,然后去exceptionStateMap判断是否包含,包含就get获取boolean结果
5.3 如果不包含,就继续判断该class,不能是ignore,必须是需要retry的(根据retryProperties判断)
5.4 判断后的结果放入到exceptionStateMap
6.还需要判断重试是否超过最大次数
7.继续判断是否超过最大重试时间
8.上面重试判断成功后,就下发重试的event事件
9.调用retryCallback.doWithRetry();执行重试逻辑
9.1 创建一个重试的命令RhinoInnerCommand
9.2 判断重试方法,是否有线程池,如果没有,就直接采用信号量方式执行
9.3 标记命令start,然后调用熔断器判断该请求能否允许执行
9.4 如果能执行,就调用doRun()方法,本质还是调用rhinoMethod的invoke方法执行,执行后把结果放入到缓存中
9.5 如果不能执行,就调用熔断之后的降级,本质为调用circuitBreaker.handleDegrade();