Java SDK は設定可能なリトライポリシーをサポートしており、リトライをトリガーするエラーの制御、最大リトライ回数の設定、エクスポネンシャルバックオフの適用が可能です。
リトライメカニズムとスロットリングポリシーが追加されました。 詳細については、「スロットリングポリシーに基づく高度なバックオフメカニズム」をご参照ください。
コアライブラリ aliyun-java-sdk-core V4.6.0 以降では、リトライメカニズムをサポートし、スロットリングポリシーに基づく高度なバックオフスキームを提供します。 詳細については、「スロットリングポリシーに基づく高度なバックオフメカニズム」をご参照ください。 以下の Maven 依存関係を追加する必要があります:
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.6.0</version>
</dependency>
リトライメカニズム
リトライメカニズムの無効化
リトライメカニズムはデフォルトで無効になっています。 明示的に無効にするには、クライアントまたはリクエストレベルでリトライポリシーを none に設定します。
// クライアントのリトライポリシーを指定して、リトライメカニズムを無効にします。
client.setSysRetryPolicy(RetryPolicy.none());
// リクエストのリトライポリシーを指定します。 リクエストのリトライポリシー設定は、クライアントのリトライポリシー設定よりも優先されます。
request.setSysRetryPolicy(RetryPolicy.none());
リトライポリシー
SDK は、3 種類のリトライ条件をサポートしています。
-
例外の指定
-
HTTP ステータスコードの指定
-
HTTP レスポンスヘッダーの指定
これら 3 つの条件は独立しています。 いずれかの条件が満たされると、SDK はリクエストをリトライするか、リトライを停止します。 リトライをトリガーするポリシーと、リトライを制限するポリシーを作成できます。
次の例では、リトライをトリガーまたは制限するポリシーを設定する方法を示します:
-
リトライポリシーコレクションの作成:
Set<RetryCondition> retryConditions = new HashSet<RetryCondition>(); // 条件の例 // リトライをトリガーするステータスコードを指定します。 次の例では、ステータスコード 500 または 501 が返されたときにリトライが実行されます。 Set<Integer> statusCodes = new HashSet<Integer>(); statusCodes.add(500); // HTTP ステータスコード statusCodes.add(501); // HTTP ステータスコード // リトライをトリガーするために使用されるポリシーにステータスコード設定を追加します。 retryConditions.add(StatusCodeCondition.create(statusCodes)); // リトライをトリガーする例外を指定します。 次の例では、`SocketTimeoutException` または `IOException` がスローされたときにリトライが実行されます。 Set<Class<? extends Exception>> exceptions = new HashSet<Class<? extends Exception>>(); exceptions.add(SocketTimeoutException.class); // 例外 exceptions.add(IOException.class); // 例外 // リトライをトリガーするために使用されるポリシーに例外設定を追加します。 retryConditions.add(ExceptionsCondition.create(exceptions)); -
リトライを制限する条件のコレクションを作成:
Set<RetryCondition> throttlingConditions = new HashSet<RetryCondition>(); // 条件の例 // リトライを制限するステータスコードを指定します。 次の例では、ステータスコード 429 が返された場合、リトライは禁止されます。 Set<Integer> code = new HashSet<Integer>(); code.add(429); // HTTP ステータスコード 429 が返された場合、リトライは禁止されます。 // リトライを制限するために使用されるポリシーにステータスコード設定を追加します。 throttlingConditions.add(StatusCodeCondition.create(code)); -
RetryPolicyに条件を追加:RetryPolicy retryPolicy = RetryPolicy.builder() .maxNumberOfRetries(3) // 最大リトライ回数。 .maxDelayTimeMillis(20 * 1000) // 最大リトライ遅延時間 (ミリ秒) 。各リトライ試行の待機時間の上限です。待機時間がこの値を超えると、リクエストは失敗します。 .retryConditions(retryConditions) // リトライをトリガーするために使用されるポリシー。 .throttlingConditions(throttlingConditions) // リトライを制限するために使用されるポリシー。 .build();
リトライ間隔は、エクスポネンシャルバックオフアルゴリズムを使用して計算されます。 EqualJitter アルゴリズムは、各リトライ前の待機時間を決定します。
リトライ条件の高度な設定
次のセクションでは、3 つの組み込み条件タイプについて詳しく説明します:
-
StatusCodeCondition-
整数のコレクションを格納します。 SDK は、各整数を返された HTTP ステータスコードと比較して、リトライをトリガーするか制限するかを決定します。
-
-
ExceptionsCondition-
例外のコレクションを格納します。 SDK は、各例外を呼び出し中にスローされた例外と比較して、リトライをトリガーするか制限するかを決定します。
-
-
HeadersCondition-
複雑な構造を持つマップを格納します。 マップキーはレスポンスヘッダーキーと一致し、値は
Pattern(com.aliyuncs.policy.retry.pattern.Pattern) インターフェイスを使用して評価されます。 このパターンは、レスポンスヘッダーの値に特定の文字列が含まれているか、特定の値と等しいかを確認します。 -
AliyunThrottlingPatternとSimplePatternの 2 つのパターンがサポートされています。AliyunThrottlingPatternは、Alibaba Cloud が提供するスロットリングポリシーを適用します。 詳細については、「スロットリングポリシーに基づく高度なバックオフメカニズム」をご参照ください。SimplePatternは、値が等しいかどうかを確認します。 -
Patternインターフェイスをカスタマイズするには、次の 3 つのメソッドを実装します:-
meetState():ルールに一致した場合にtrueを返します。 -
escapeTime():エスケープ時間をミリ秒単位で返します。 このメソッドは、リトライ制限ポリシーにのみ適用されます。 戻り値が-1でない場合、リトライは永続的に制限されるのではなく、指定された期間一時停止されます。 SDK は、エスケープ時間が経過するまで待ってからリトライします。 この値が最大リトライ間隔を超えると、リクエストはただちに失敗します。 -
readFormHeadersContent(String content):ヘッダーから値を解析して割り当てます。SimplePatternの実装を直接再利用できます。
-
-
-
カスタム条件
-
カスタム条件を作成するには、次の 2 つのメソッドを持つ
RetryConditionインターフェイスを実装します:-
meetState(RetryPolicyContext var1):コンテキストに基づいてリトライ条件が満たされているかどうかを評価します。 -
escapeTime(RetryPolicyContext var1):エスケープ時間を計算します。 このメソッドは制限ポリシーにのみ適用されます。 トリガーポリシーの場合は-1を返します。
-
-
完全なサンプルコード
サンプルコード:
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) {
// DefaultAcsClient インスタンスを作成して初期化します。
DefaultProfile profile = DefaultProfile.getProfile(
// リージョン ID。
"cn-hangzhou",
// 環境変数から RAM ユーザーの AccessKey ID を取得します。
System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"),
// 環境変数から RAM ユーザーの AccessKey Secret を取得します。
System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
IAcsClient client = new DefaultAcsClient(profile);
// クライアントレベルでリトライポリシーを設定します。
client.setSysRetryPolicy(RetryPolicy.none());
// この例では CommonRequest を使用します。 この設定は、<APIName>Request などの製品固有の SDK にも適用されます。
CommonRequest request = new CommonRequest();
// リクエストレベルでリトライポリシーを設定します。 この設定は、クライアントレベルの設定よりも優先度が高くなります。
request.setSysRetryPolicy(RetryPolicy.defaultRetryPolicy(true));
// リトライをトリガーするステータスコードを設定します。
Set<RetryCondition> retryConditions = new HashSet<RetryCondition>();
Set<Integer> statusCodes = new HashSet<Integer>();
statusCodes.add(500); // HTTP ステータスコード
statusCodes.add(501); // HTTP ステータスコード
retryConditions.add(StatusCodeCondition.create(statusCodes));
// リトライをトリガーする例外を設定します。
Set<Class<? extends Exception>> exceptions = new HashSet<Class<? extends Exception>>();
exceptions.add(SocketTimeoutException.class); // 例外
exceptions.add(IOException.class); // 例外
retryConditions.add(ExceptionsCondition.create(exceptions));
// リトライを制限するステータスコードを設定します。
Set<RetryCondition> throttlingConditions = new HashSet<RetryCondition>();
Set<Integer> code = new HashSet<Integer>();
code.add(429); // HTTP ステータスコード、制限ポリシー。ステータスコード 429 の場合、リトライは制限されます。
throttlingConditions.add(StatusCodeCondition.create(code));
RetryPolicy retryPolicy = RetryPolicy.builder()
.maxNumberOfRetries(3) // 最大リトライ回数。
.maxDelayTimeMillis(20 * 1000) // 最大リトライ遅延時間 (ミリ秒) 。各リトライ試行の待機時間の上限です。待機時間がこの値を超えると、リクエストは失敗します。
.retryConditions(retryConditions) // リトライをトリガーするポリシー。
.enableAliyunThrottlingControl(true) // 制御には Alibaba Cloud のスロットリングポリシーを使用します。
.throttlingConditions(throttlingConditions) // 独自の制限ポリシーを作成することもできます。
.build();
try {
// この例では CommonRequest を使用します。 この設定は、<APIName>Request などの製品固有の SDK にも適用されます。
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())) {
// スロットリング例外は `ClientException` にカプセル化されています。
}
}
}
}