# demo-spring-retry **Repository Path**: homesangsang/demo-spring-retry ## Basic Information - **Project Name**: demo-spring-retry - **Description**: 测试spring-retry功能 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-05-24 - **Last Updated**: 2022-05-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 1. `org.springframework.retry.annotation.RetryConfiguration.afterPropertiesSet` 在这个方法中的`buildAdvice()`调用中,创建了Interceptor,Interceptor本质上是个advice 2. 在上个步骤中的`buildAdvice()` 方法中,添加了listener,此处可以注入自定义的listener, 所以,如果没有特殊需求,无需在`@Retryable`注解中配置listener 3. `@Recover`注解,需要注解在和`@Retryable` 方法在同一个类中使用,`@Retryable`注解中有`recover` 参数,在同一个类中有多个`@Recover`注解的方法时,指定需要使用的方法 ```java // 逻辑在在这个方法org.springframework.retry.annotation.RecoverAnnotationRecoveryHandler.findClosestMatch中 // 片段如下 public class RecoverAnnotationRecoveryHandler implements MethodInvocationRecoverer { private Method findClosestMatch(Object[] args, Class cause) { Method result = null; if (StringUtils.isEmpty(this.recoverMethodName)) { int min = Integer.MAX_VALUE; for (Map.Entry entry : this.methods.entrySet()) { Method method = entry.getKey(); SimpleMetadata meta = entry.getValue(); Class type = meta.getType(); if (type == null) { type = Throwable.class; } if (type.isAssignableFrom(cause)) { int distance = calculateDistance(cause, type); if (distance < min) { min = distance; result = method; } else if (distance == min) { boolean parametersMatch = compareParameters(args, meta.getArgCount(), method.getParameterTypes()); if (parametersMatch) { result = method; } } } } } else { for (Map.Entry entry : this.methods.entrySet()) { Method method = entry.getKey(); if (method.getName().equals(this.recoverMethodName)) { SimpleMetadata meta = entry.getValue(); if (meta.type.isAssignableFrom(cause) && compareParameters(args, meta.getArgCount(), method.getParameterTypes())) { result = method; break; } } } } return result; } } ``` 4. `@Recover`注解的方法,方法的第一个参数只能是`java.lang.Throwable` 类及其子类,第二个参数要根据`@Retryable` 方法的参数填写