All Products
Search
Document Center

Alibaba Cloud SDK:Mekanisme retry

Last Updated:Jun 17, 2026

SDK Java mendukung kebijakan retry yang dapat dikonfigurasi sehingga Anda dapat mengontrol error mana yang memicu retry, menetapkan jumlah maksimum retry, serta menerapkan exponential backoff.

Catatan

Mekanisme retry dan kebijakan throttling telah ditambahkan. Untuk informasi selengkapnya, lihat Mekanisme backoff lanjutan berdasarkan kebijakan throttling.

Pustaka inti aliyun-java-sdk-core versi 4.6.0 atau lebih baru mendukung mekanisme retry dan menyediakan skema backoff lanjutan berdasarkan kebijakan throttling. Untuk informasi selengkapnya, lihat Mekanisme backoff lanjutan berdasarkan kebijakan throttling. Anda harus menambahkan dependensi Maven berikut:

<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-java-sdk-core</artifactId>
    <version>4.6.0</version>
</dependency>

Mekanisme retry

Menonaktifkan mekanisme retry

Mekanisme retry dinonaktifkan secara default. Untuk menonaktifkannya secara eksplisit, atur kebijakan retry menjadi none pada tingkat client atau request:

// Tentukan kebijakan retry untuk client guna menonaktifkan mekanisme retry.
client.setSysRetryPolicy(RetryPolicy.none());

// Tentukan kebijakan retry untuk request. Konfigurasi kebijakan retry pada request memiliki prioritas lebih tinggi daripada konfigurasi pada client.
request.setSysRetryPolicy(RetryPolicy.none());

Kebijakan retry

SDK mendukung tiga jenis kebijakan retry:

  1. Tentukan exception.

  2. Tentukan kode status HTTP.

  3. Tentukan header respons HTTP.

Ketiga kondisi ini bersifat independen. Jika salah satu kondisi terpenuhi, SDK akan melakukan retry atau menghentikan retry. Anda dapat membuat kebijakan yang memicu retry maupun kebijakan yang membatasinya.

Contoh berikut menunjukkan cara mengonfigurasi kebijakan yang memicu atau membatasi retry:

  • Buat kumpulan kebijakan retry:

    Set<RetryCondition> retryConditions = new HashSet<RetryCondition>();
    
    // Contoh kondisi
    // Tentukan kode status untuk memicu retry. Pada contoh berikut, retry dilakukan ketika kode status 500 atau 501 dikembalikan.
    Set<Integer> statusCodes = new HashSet<Integer>();
    statusCodes.add(500); // http statusCode
    statusCodes.add(501); // http statusCode
    // Tambahkan konfigurasi kode status ke kebijakan yang digunakan untuk memicu retry.
    retryConditions.add(StatusCodeCondition.create(statusCodes));
    
    // Tentukan exception untuk memicu retry. Pada contoh berikut, retry dilakukan ketika SocketTimeoutException atau IOException dilemparkan.
    Set<Class<?  extends Exception>> exceptions = new HashSet<Class<?  extends Exception>>();
    exceptions.add(SocketTimeoutException.class); // exception
    exceptions.add(IOException.class); // exception
    // Tambahkan konfigurasi exception ke kebijakan yang digunakan untuk memicu retry.
    retryConditions.add(ExceptionsCondition.create(exceptions));
  • Buat kumpulan kondisi untuk membatasi retry:

    Set<RetryCondition> throttlingConditions = new HashSet<RetryCondition>();
    
    // Contoh kondisi
    // Tentukan kode status untuk membatasi retry. Pada contoh berikut, retry dilarang ketika kode status 429 dikembalikan.
    Set<Integer> code = new HashSet<Integer>();
    code.add(429); // Tentukan kode status HTTP untuk membatasi retry. Pada contoh ini, retry dilarang jika kode status 429 dikembalikan.
    // Tambahkan konfigurasi kode status ke kebijakan yang digunakan untuk membatasi retry.
    throttlingConditions.add(StatusCodeCondition.create(code));
  • Tambahkan kondisi ke RetryPolicy:

    RetryPolicy retryPolicy = RetryPolicy.builder()
                    .maxNumberOfRetries(3) // Jumlah maksimum retry.
                    .maxDelayTimeMillis(20 * 1000) // Interval retry maksimum. Satuan: milidetik. Jika durasi yang ditentukan terlampaui, tidak ada retry yang dilakukan.
                    .retryConditions(retryConditions) // Kebijakan yang digunakan untuk memicu retry.
                    .throttlingConditions(throttlingConditions) // Kebijakan yang digunakan untuk membatasi retry.
                    .build();

Interval retry dihitung menggunakan algoritma exponential backoff. Algoritma EqualJitter menentukan waktu tunggu sebelum setiap retry.

Konfigurasi pengaturan lanjutan untuk kondisi retry

Bagian berikut menjelaskan tiga jenis kondisi bawaan secara detail.

  1. StatusCodeCondition

    1. Menyimpan kumpulan bilangan bulat. SDK membandingkan setiap bilangan dengan kode status HTTP yang dikembalikan untuk menentukan apakah akan memicu atau membatasi retry.

  2. ExceptionsCondition

    1. Menyimpan kumpulan exception. SDK membandingkan setiap exception dengan exception yang dilemparkan selama pemanggilan untuk menentukan apakah akan memicu atau membatasi retry.

  3. HeadersCondition

    1. Menyimpan map dengan struktur kompleks. Kunci map dicocokkan dengan kunci header respons, dan nilainya dievaluasi melalui antarmuka Pattern (com.aliyuncs.policy.retry.pattern.Pattern). Pola ini memeriksa apakah nilai header respons berisi string tertentu atau sama dengan nilai yang diberikan.

    2. Dua pola didukung: AliyunThrottlingPattern dan SimplePattern. AliyunThrottlingPattern menerapkan kebijakan throttling yang disediakan oleh Alibaba Cloud. Untuk informasi selengkapnya, lihat Mekanisme backoff lanjutan berdasarkan kebijakan throttling. SimplePattern memeriksa apakah nilai-nilai tersebut sama.

    3. Untuk menyesuaikan antarmuka Pattern, implementasikan tiga metode berikut:

      1. meetState(): mengembalikan true ketika aturan cocok.

      2. `escapeTime()`: mengembalikan waktu escape dalam milidetik. Metode ini hanya berlaku untuk kebijakan pembatasan retry. Jika nilai kembali bukan -1, retry dijeda selama durasi yang ditentukan, bukan dibatasi secara permanen. SDK akan menunggu hingga waktu escape berlalu sebelum mencoba ulang. Jika nilai ini melebihi interval retry maksimum, request langsung gagal.

      3. readFormHeadersContent(String content): mengurai dan menetapkan nilai dari header. Anda dapat langsung menggunakan implementasi SimplePattern.

  4. Kondisi kustom

    1. Untuk membuat kondisi kustom, implementasikan antarmuka RetryCondition dengan dua metode berikut:

      1. meetState(RetryPolicyContext var1): mengevaluasi apakah kondisi retry terpenuhi berdasarkan konteks.

      2. escapeTime(RetryPolicyContext var1): menghitung waktu escape. Metode ini hanya berlaku untuk kebijakan pembatasan. Untuk kebijakan pemicu, kembalikan -1.

Kode contoh lengkap

Kode contoh:

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) {
        // Buat dan inisialisasi instans DefaultAcsClient.
        DefaultProfile profile = DefaultProfile.getProfile(
                // ID wilayah.
                "cn-hangzhou",
                // Dapatkan ID AccessKey Pengguna RAM dari variabel lingkungan.
                System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"),
                // Dapatkan Rahasia AccessKey Pengguna RAM dari variabel lingkungan.
                System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
        IAcsClient client = new DefaultAcsClient(profile);
        // Konfigurasikan kebijakan retry pada tingkat client.
        client.setSysRetryPolicy(RetryPolicy.none());
        // Contoh ini menggunakan CommonRequest. Konfigurasi ini juga berlaku untuk SDK spesifik produk, seperti <APIName>Request.
        CommonRequest request = new CommonRequest();
        // Konfigurasikan kebijakan retry pada tingkat request. Konfigurasi ini memiliki prioritas lebih tinggi daripada konfigurasi tingkat client.
        request.setSysRetryPolicy(RetryPolicy.defaultRetryPolicy(true));

        // Konfigurasikan kode status untuk memicu retry.
        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));

        // Konfigurasikan exception untuk memicu retry.
        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));

        // Konfigurasikan kode status untuk membatasi retry.
        Set<RetryCondition> throttlingConditions = new HashSet<RetryCondition>();
        Set<Integer> code = new HashSet<Integer>();
        code.add(429); // http statusCode, kebijakan pembatasan. Artinya, kode status 429 membatasi retry.
        throttlingConditions.add(StatusCodeCondition.create(code));

        RetryPolicy retryPolicy = RetryPolicy.builder()
                .maxNumberOfRetries(3) // Jumlah maksimum retry.
                .maxDelayTimeMillis(20 * 1000) // Interval retry maksimum. Tidak ada retry tambahan setelah waktu ini.
                .retryConditions(retryConditions) // Kebijakan untuk memicu retry.
                .enableAliyunThrottlingControl(true) // Gunakan kebijakan throttling Alibaba Cloud untuk kontrol.
                .throttlingConditions(throttlingConditions) // Anda juga dapat menulis kebijakan pembatasan sendiri.
                .build();

        try {
            // Contoh ini menggunakan CommonRequest. Konfigurasi ini juga berlaku untuk SDK spesifik produk, seperti <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())) {
                // Exception throttling dikemas dalam ClientException.
            }
        }
    }
}