Fingir análisis de código fuente, su clase de implementación está en SynchronousMethodHandler, y el método de implementación es invocación de objeto público (Object [] argv), su análisis de código es el siguiente:
1. Construya los datos de la solicitud y convierta el objeto a json:
RequestTemplate template = buildTemplateFromArgs.create(argv);
2. Envíe la solicitud de ejecución (los datos de respuesta se decodificarán si la ejecución es exitosa):
executeAndDecode(template, options);
3. La solicitud de ejecución tendrá un mecanismo de reintento:
Retryer retryer = this.retryer.clone();
while (true) {
try {
return executeAndDecode(template, options);
} catch (RetryableException e) {
try {
retryer.continueOrPropagate(e);
} catch (RetryableException th) {
Throwable cause = th.getCause();
// 重试结束 或则 不允许重试,则通过抛异常的形式终止
if (propagationPolicy == UNWRAP && cause != null) {
throw cause;
} else {
throw th;
}
}
if (logLevel != Logger.Level.NONE) {
logger.logRetry(metadata.configKey(), logLevel);
}
continue;
}
}
4. Retryer es un reintento. Hay dos formas de implementarlo. La primera es la implementación predeterminada del sistema y la segunda es que puede personalizar el reintento, que generalmente se usa menos. Puede verlo a través de la implementación predeterminada de la clase de reintento Default. El número de reintentos en el constructor es 5.
public Default() {
this(100, SECONDS.toMillis(1), 5);
}
public Default(long period, long maxPeriod, int maxAttempts) {
this.period = period;
this.maxPeriod = maxPeriod;
this.maxAttempts = maxAttempts;
this.attempt = 1;
}
Por lo tanto, la solución más simple y más utilizada al problema de la idempotencia de las llamadas de Feign es dejar que Feign no vuelva a intentarlo.