1 Star 0 Fork 0

wanglei/spring-retry-learn

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
wanglei-wlOwn wanglei 0926 27da084 2年前
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

注:

1、@Recover可以写多个吗?

@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

2、如何定义@Recover注解方法的参数列表?

@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;
		}

3、@Recover注解的方法能否写到其他类?

否?因为和RetryCallback的目标类是一样的(例子中的SpringRetryService),即要和业务逻辑方法写在同一个类中

空文件

简介

spring retry实践 展开 收起
取消

发行版

暂无发行版

贡献者

全部

语言

近期动态

不能加载更多了
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/wlOwn/spring-retry-learn.git
git@gitee.com:wlOwn/spring-retry-learn.git
wlOwn
spring-retry-learn
spring-retry-learn
master

搜索帮助