代码拉取完成,页面将自动刷新
@Recover可以写多个,因为他会根据实际去匹配对应的@Recover注解方法。RecoverAnnotationRecoveryHandler.init
ReflectionUtils.doWithMethods(target.getClass(), new MethodCallback() {
@Override
public void doWith(Method method) throws IllegalArgumentException {
Recover recover = AnnotatedElementUtils.findMergedAnnotation(method, Recover.class);
if (recover == null) {
recover = findAnnotationOnTarget(target, method);
}
// 如果两者都是参数化类型并且可以相互赋值(即泛型类型可以匹配),则将当前方法添加到方法映射中。
if (recover != null && failingMethod.getGenericReturnType() instanceof ParameterizedType
&& method.getGenericReturnType() instanceof ParameterizedType) {
if (isParameterizedTypeAssignable((ParameterizedType) method.getGenericReturnType(),
(ParameterizedType) failingMethod.getGenericReturnType())) {
putToMethodsMap(method, types);
}
}
// 如果两者的返回类型可以相互赋值(即普通类型可以匹配),同样将当前方法添加到方法映射中。
else if (recover != null && method.getReturnType().isAssignableFrom(failingMethod.getReturnType())) {
putToMethodsMap(method, types);
}
}
});
多个@Recover注解方法被匹配到后,实际调用会选择最匹配的。匹配算法:RecoverAnnotationRecoveryHandler.findClosestMatch
@Recover注解方法的返回值,第一个是异常类型的参数,如果想获取调用类,需要@recover注解的方法从第二个参数开始和调用类的参数列表对应起来。算法:SimpleMetadata.getArgs
public Object[] getArgs(Throwable t, Object[] args) {
// recover类的参数长度
Object[] result = new Object[getArgCount()];
int startArgs = 0;
if (this.type != null) {
// 第一个参数为Throwable参数。
result[0] = t;
startArgs = 1;
}
// 计算出应该复制的长度
int length = Math.min(result.length - startArgs, args.length);
if (length == 0) {
return result;
}
// 开始复制参数
System.arraycopy(args, 0, result, startArgs, length);
return result;
}
否?因为和RetryCallback的目标类是一样的(例子中的SpringRetryService),即要和业务逻辑方法写在同一个类中
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。