# spring-retry-learn **Repository Path**: wlOwn/spring-retry-learn ## Basic Information - **Project Name**: spring-retry-learn - **Description**: spring retry实践 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-09-20 - **Last Updated**: 2023-09-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## 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),即要和业务逻辑方法写在同一个类中