El SDK de Java es compatible con políticas de reintento configurables que le permiten controlar qué errores desencadenan reintentos, establecer el número máximo de reintentos y aplicar un backoff exponencial.
Se agregó un mecanismo de reintento y una política de limitación. Para obtener más información, consulte Advanced backoff mechanism based on the throttling policy.
La biblioteca principal aliyun-java-sdk-core V4.6.0 o posterior admite el mecanismo de reintento y proporciona un esquema avanzado de backoff basado en la política de limitación. Para obtener más información, consulte Advanced backoff mechanism based on the throttling policy. Debe agregar la dependencia de Maven a continuación:
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.6.0</version>
</dependency>
Mecanismo de reintento
Deshabilite el mecanismo de reintento
El mecanismo de reintento está deshabilitado de forma predeterminada. Para deshabilitarlo de manera explícita, establezca la política de reintento en none en el nivel de cliente o de solicitud:
// Specify a retry policy for the client to disable the retry mechanism.
client.setSysRetryPolicy(RetryPolicy.none());
// Specify a retry policy for the request. The retry policy configuration of the request takes precedence over the retry policy configuration of the client.
request.setSysRetryPolicy(RetryPolicy.none());
Políticas de reintento
El SDK es compatible con tres tipos de políticas de reintento:
Especifique excepciones.
Especifique códigos de estado HTTP.
Especifique encabezados de respuesta HTTP.
Estas tres condiciones son independientes. Si se cumple alguna de ellas, el SDK vuelve a intentar la solicitud o detiene los reintentos. Puede crear políticas que desencadenen reintentos y políticas que los restrinjan.
Los ejemplos a continuación muestran cómo configurar políticas que desencadenan o restringen reintentos:
-
Cree una colección de condiciones de reintento:
Set<RetryCondition> retryConditions = new HashSet<RetryCondition>(); // Example of conditions // Specify status codes to trigger a retry. In the following example, a retry is performed when the status code 500 or 501 is returned. Set<Integer> statusCodes = new HashSet<Integer>(); statusCodes.add(500); // http statusCode statusCodes.add(501); // http statusCode // Add the status code configuration to the policy that is used to trigger a retry. retryConditions.add(StatusCodeCondition.create(statusCodes)); // Specify exceptions to trigger a retry. In the following example, a retry is performed when a SocketTimeoutException or IOException is thrown. Set<Class<? extends Exception>> exceptions = new HashSet<Class<? extends Exception>>(); exceptions.add(SocketTimeoutException.class); // exception exceptions.add(IOException.class); // exception // Add the exception configuration to the policy that is used to trigger a retry. retryConditions.add(ExceptionsCondition.create(exceptions)); -
Cree una colección de condiciones para restringir reintentos:
Set<RetryCondition> throttlingConditions = new HashSet<RetryCondition>(); // Example of conditions // Specify status codes to restrict a retry. In the following example, a retry is prohibited when the status code 429 is returned. Set<Integer> code = new HashSet<Integer>(); code.add(429); // Specify an HTTP status code to restrict a retry. In this example, a retry is prohibited if the status code 429 is returned. // Add the status code configuration to the policy that is used to restrict retires. throttlingConditions.add(StatusCodeCondition.create(code)); -
Agregue condiciones a RetryPolicy:
RetryPolicy retryPolicy = RetryPolicy.builder() .maxNumberOfRetries(3) // The maximum number of retries. .maxDelayTimeMillis(20 * 1000) // The maximum retry interval. Unit: milliseconds. If the specified duration is exceeded, no retries are performed. .retryConditions(retryConditions) // The policy that is used to trigger retries. . .throttlingConditions(throttlingConditions) // The policy that is used to restrict retries. .build();
El algoritmo de backoff exponencial calcula los intervalos de reintento. El algoritmo EqualJitter determina el tiempo de espera antes de cada reintento.
Configure ajustes avanzados de las condiciones para reintentos
La sección a continuación describe en detalle los tres tipos de condiciones integrados.
-
StatusCodeCondition
Almacena una colección de números enteros. El SDK compara cada número entero con el código de estado HTTP devuelto para determinar si se deben desencadenar o restringir los reintentos.
-
ExceptionsCondition
Almacena una colección de excepciones. El SDK compara cada excepción con la excepción generada durante la llamada para determinar si se deben desencadenar o restringir los reintentos.
-
HeadersCondition
Almacena un mapa con una estructura compleja. La clave del mapa coincide con la clave del encabezado de respuesta y el valor se evalúa mediante la interfaz Pattern (com.aliyuncs.policy.retry.pattern.Pattern). El patrón verifica si el valor del encabezado de respuesta contiene una cadena específica o es igual a un valor determinado.
Se admiten dos patrones: AliyunThrottlingPattern y SimplePattern. AliyunThrottlingPattern aplica la política de limitación proporcionada por Alibaba Cloud. Para obtener más información, consulte Advanced backoff mechanism based on the throttling policy. SimplePattern verifica si los valores son iguales.
-
Para personalizar la interfaz Pattern, implemente los tres métodos a continuación:
meetState(): devuelve true cuando se cumple la regla.
escapeTime(): devuelve el tiempo de escape en milisegundos. Este método solo se aplica a las políticas de restricción de reintentos. Si el valor de retorno no es -1, los reintentos se pausan durante la duración especificada en lugar de restringirse de forma permanente. El SDK espera a que transcurra el tiempo de escape antes de reintentar. Si este valor supera el intervalo máximo de reintento, la solicitud falla de inmediato.readFormHeadersContent(String content): analiza y asigna un valor del encabezado. Puede reutilizar directamente la implementación de SimplePattern.
-
Condiciones personalizadas
-
Para crear condiciones personalizadas, implemente la interfaz RetryCondition con los dos métodos a continuación:
meetState(RetryPolicyContext var1): evalúa si se cumple la condición de reintento según el contexto.
escapeTime(RetryPolicyContext var1): calcula el tiempo de escape. Este método solo se aplica a las políticas de restricción. Para las políticas de desencadenamiento, devuelva -1.
-
Código de ejemplo completo
Código de ejemplo:
package com.aliyun.sample;
import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.exceptions.ThrottlingException;
import com.aliyuncs.policy.retry.RetryPolicy;
import com.aliyuncs.policy.retry.conditions.ExceptionsCondition;
import com.aliyuncs.policy.retry.conditions.RetryCondition;
import com.aliyuncs.policy.retry.conditions.StatusCodeCondition;
import com.aliyuncs.profile.DefaultProfile;
import java.io.IOException;
import java.net.SocketTimeoutException;
import java.util.HashSet;
import java.util.Set;
public class Sample {
public static void main(String[] args) {
// Create and initialize a DefaultAcsClient instance.
DefaultProfile profile = DefaultProfile.getProfile(
// The region ID.
"cn-hangzhou",
// Obtain the AccessKey ID of the RAM user from an environment variable.
System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"),
// Obtain the AccessKey secret of the RAM user from an environment variable.
System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
IAcsClient client = new DefaultAcsClient(profile);
// Configure the retry policy at the client level.
client.setSysRetryPolicy(RetryPolicy.none());
// This example uses CommonRequest. The configuration also applies to product-specific SDKs, such as <APIName>Request.
CommonRequest request = new CommonRequest();
// Configure the retry policy at the request level. This configuration has a higher priority than the client-level configuration.
request.setSysRetryPolicy(RetryPolicy.defaultRetryPolicy(true));
// Configure status codes to trigger retries.
Set<RetryCondition> retryConditions = new HashSet<RetryCondition>();
Set<Integer> statusCodes = new HashSet<Integer>();
statusCodes.add(500); // http statusCode
statusCodes.add(501); // http statusCode
retryConditions.add(StatusCodeCondition.create(statusCodes));
// Configure exceptions to trigger retries.
Set<Class<? extends Exception>> exceptions = new HashSet<Class<? extends Exception>>();
exceptions.add(SocketTimeoutException.class); // exception
exceptions.add(IOException.class); // exception
retryConditions.add(ExceptionsCondition.create(exceptions));
// Configure status codes to restrict retries.
Set<RetryCondition> throttlingConditions = new HashSet<RetryCondition>();
Set<Integer> code = new HashSet<Integer>();
code.add(429); // http statusCode, restriction policy. This means a 429 status code restricts retries.
throttlingConditions.add(StatusCodeCondition.create(code));
RetryPolicy retryPolicy = RetryPolicy.builder()
.maxNumberOfRetries(3) // Maximum number of retries.
.maxDelayTimeMillis(20 * 1000) // Maximum retry interval. No more retries are attempted after this time.
.retryConditions(retryConditions) // Policy to trigger retries.
.enableAliyunThrottlingControl(true) // Use the Alibaba Cloud throttling policy for control.
.throttlingConditions(throttlingConditions) // You can also write your own restriction policy.
.build();
try {
// This example uses CommonRequest. The configuration also applies to product-specific SDKs, such as <APIName>Request.
CommonResponse response = client.getCommonResponse(request);
System.out.println(response.getData());
} catch (ServerException e) {
e.printStackTrace();
} catch (ClientException e) {
e.printStackTrace();
if (ThrottlingException.class.isAssignableFrom(e.getCause().getClass())) {
// The throttling exception is encapsulated in ClientException.
}
}
}
}