业务相关参数-retryMethod
retryMethod参数则允许我们可以来自定义重试函数的入口。
通过在retryable参数中执行方法需要执行的类,我们可以指定重试请求走到的方法。 首先我们来看一下retryable中的默认值ExecutorAnnotationMethod实现了什么?在ExecutorAnnotationMethod方法中,通过反射指定的默认重试方法就是接口的原重试方法。而我们如果要实现一个自定义的重试方法,则需要自己实现ExecutorMethod方法。
java
@Slf4j
public class ExecutorAnnotationMethod implements ExecutorMethod {
private RetryerInfo retryerInfo;
public ExecutorAnnotationMethod(RetryerInfo retryerInfo) {
this.retryerInfo = retryerInfo;
}
@Override
public Object doExecute(Object params) {
Class<?>[] paramTypes = retryerInfo.getMethod().getParameterTypes();
LogUtils.info(log, "执行原重试方法:[{}],参数为:[{}]", retryerInfo.getExecutorClassName(), JsonUtil.toJsonString(params));
if (paramTypes.length > 0) {
return ReflectionUtils.invokeMethod(retryerInfo.getMethod(), retryerInfo.getExecutor(), (Object[]) params);
} else {
return ReflectionUtils.invokeMethod(retryerInfo.getMethod(), retryerInfo.getExecutor());
}
}
}
public interface ExecutorMethod {
Object doExecute(Object params);
}
那我们来实现一个自定义的重试方法OrderRetryMethod:
java
@Retryable(scene = "remoteRetryWithRetryMethod", retryStrategy = RetryType.ONLY_REMOTE,
retryMethod = OrderRetryMethod.class)
public boolean remoteRetryWithRetryMethod(OrderVo orderVo){
throw new NullPointerException();
}
其中OrderRetryMethod的实现方式为:
java
@Component
public class OrderRetryMethod implements ExecutorMethod {
@Override
public Object doExecute(Object params) {
// 将特定类型的 Object 对象指定为 Object[]
Object[] args = (Object[]) params;
OrderVo orderVo = (OrderVo) args[0];
log.info("进入自定义的回调方法,参数信息是{}", JSONUtil.toJsonStr(orderVo));
throw new ArithmeticException();
}
}
在上层调用后我们观察控制台查看输出结果:
可以看到已经走进了我们的自定义方法中。