[AWS SDK for Java] Définir la stratégie de nouvelle tentative pour le client S3

Les informations que je voulais juste n'étaient pas en japonais, alors je vais les documenter. Lors du téléchargement d'un fichier vers S3 à l'aide du kit AWS SDK pour Java, ajoutez des paramètres détaillés.

table des matières

Contour du cas autour de la nouvelle tentative

Je souhaite télécharger un fichier sur S3 localement à l'aide du kit SDK AWS pour Java. Ensuite, en prévision d'un cas où la communication est interrompue en raison des circonstances d'AWS ou qu'elle ne peut pas fonctionner normalement pour diverses raisons, nous aimerions intégrer une politique de nouvelle tentative dans le client AWS. Cette fois, nous préparerons une classe utilitaire qui renvoie un singleton d'objets ʻAmazonS3` inclus dans le kit AWS SDK pour Java.

Dans cet article, je me concentrerai sur les «paramètres d'options lors de la génération d'un client», ce qui m'a particulièrement troublé. Par conséquent, la description relative au traitement avant et après le téléchargement du fichier est omise.

Je vais essayer de le mettre en œuvre pour le moment

Créez un client doté d'options client simples. En tant que flux, nous en préparerons trois, une instance de stratégie de nouvelle tentative, une instance de paramètre client et un client.

Tout d'abord, préparez une méthode qui renvoie une instance RetryPolicy contenant les paramètres de stratégie de base et les stratégies définies par AWS.

AmazonS3Utils.java


/**
 *Entrez les valeurs appropriées pour baseDelay et maxBackoffTime dans le constructeur ExponentialBackoffStrategy.
 *Remarque: Ici, une valeur appropriée est entrée comme échantillon.
 */
private static RetryPolicy getS3BaseRetryPolicy() {
        return new RetryPolicy(
                new PredefinedRetryPolicies.SDKDefaultRetryCondition(),
                new PredefinedBackoffStrategies.ExponentialBackoffStrategy(0, 0),
                PredefinedRetryPolicies.DEFAULT_MAX_ERROR_RETRY,
                true
        );
    }

Ensuite, appelez la méthode qui renvoie l'instance RetryPolicy définie dans ↑ pour définir les paramètres du client.

AmazonS3Utils.java


private static final ClientConfiguration clientConfiguration = new ClientConfiguration()
            .withRetryPolicy(getS3BaseRetryPolicy());

Ensuite, initialisez l'objet ʻAmazonS3`, qui est le point d'entrée du client S3 appelé par d'autres classes et méthodes, avec les paramètres du client.

AmazonS3Utils.java


private static final AmazonS3 amazonS3 = AmazonS3ClientBuilder
            .standard()
            .withClientConfiguration(clientConfiguration)
            .withRegion(Regions.DEFAULT_REGION)
            .build();

Pour résumer les paramètres jusqu'à présent,

AmazonS3Utils.java


public final class AmazonS3Utils {

    /**
     *Initialisez les paramètres du client pour refléter la stratégie de nouvelle tentative.
     */
    private static final ClientConfiguration clientConfiguration = new ClientConfiguration()
            .withRetryPolicy(getS3BaseRetryPolicy());

    /**
     *Initialisez l'instance Amazon S3.
     */
    private static final AmazonS3 amazonS3 = AmazonS3ClientBuilder
            .standard()
            .withClientConfiguration(clientConfiguration)
            .withRegion(Regions.DEFAULT_REGION).build();

    /**
     *Renvoie un objet qui fournit une opération de fichier
     */
    public static AmazonS3 getS3() {
        return amazonS3;
    }

    /**
     *Instanciez la stratégie de nouvelle tentative.
     */
    private static RetryPolicy getS3BaseRetryPolicy() {
        return new RetryPolicy(
                new PredefinedRetryPolicies.SDKDefaultRetryCondition(),
                new PredefinedBackoffStrategies.ExponentialBackoffStrategy(0, 0),
                PredefinedRetryPolicies.DEFAULT_MAX_ERROR_RETRY,
                true
        );
    }
}

Vous êtes maintenant prêt. Après cela, vous pouvez appeler le client S3 qui reflète les paramètres avec la méthode getS3.

Organiser les objets apparaissant

Je voudrais trier les rôles de plusieurs classes qui apparaissent dans les exemples d'implémentation. Je n'avais pas l'impression de pouvoir faire ce que je voulais faire, peut-être parce que je ne savais pas trop comment chercher ...

AmazonS3 (interface)

Une interface qui définit les méthodes de manipulation des objets S3. L'implémentation concrète semble être fournie par la classe client builder. AmazonS3 Cet objet est une interface, et l'outil semble être fourni par ʻAmazonS3ClientBuilder` etc.

À l'origine, avant d'ajouter les paramètres autour de la nouvelle tentative, cela a été fait avec ʻAmazonS3ClientBuilder.standard (). Build (); `. Je pense qu'un client aussi minimaliste suffira s'il nécessite un minimum de fonctionnalités.

ClientConfiguration (classe)

ClientConfiguration est une nouvelle tentative Classes de configuration facultatives pouvant être ajoutées aux clients AWS, telles que les proxys et les chaînes d'agent utilisateur. Dans cet exemple, j'ai passé RetryPolicy avec une certaine personnalisation, mais il semble que les paramètres par défaut peuvent être intégrés dans les paramètres du client en appelant la méthode statique getDefaultRetryPolicy () ʻin PredefinedRetryPolicies`.

RetryPolicy (classe)

RetryPolicy est Une classe qui construit une stratégie de nouvelle tentative en combinaison avec ClientConfiguration. Initialisez en emballant les objets et les valeurs nécessaires dans le constructeur.

Les interfaces telles que RetryCondition et BackoffStrategy sont spécifiées comme arguments dans le constructeur, mais au début, je me demandais quoi spécifier pour la classe qui correspond à l'interface de l'argument. Il existe plusieurs constructeurs, mais l'un d'eux est

RetryPolicy.java


public RetryPolicy(RetryCondition retryCondition,
    BackoffStrategy backoffStrategy,
    int maxErrorRetry,
    boolean honorMaxErrorRetryInClientConfig) {
    this(retryCondition, backoffStrategy, maxErrorRetry, honorMaxErrorRetryInClientConfig, false); 
} 

Après de nombreuses recherches, j'ai trouvé que le SDK avait une classe qui pouvait contenir des politiques prédéfinies.

Pour l'interface RetryCondition, nous avons décidé de suivre les valeurs par défaut du kit AWS SDK pour cette implémentation. Dans PredefinedRetryPolicies Il existe plusieurs types d'implémentations qui peuvent être utilisées, vous pouvez donc les passer au constructeur RetryPolicy. Si vous n'êtes pas particulier sur les paramètres, vous pouvez spécifier la propriété statique DEFAULT_RETRY_CONDITION qui renvoie les paramètres par défaut.

BackoffStrategy Classe abstraite étendue [V2CompatibleBackoffStrategy](https://github.com/aws/aws-sdk-java/blob/master/aws-java-sdk-core/src/main/java/com/amazonaws/retry/V2CompatibleBackoffStrategy. java) est fourni, et vous pouvez définir des arguments équivalents à l'interface BackoffStrategy en utilisant un adaptateur qui étend cette classe abstraite et diverses classes concrètes.

Plus précisément, [PredefinedBackoffStrategies](https://github.com/aws/aws-sdk-java/blob/master/aws-java-sdk-core/src/main/java/com/amazonaws/retry/PredefinedBackoffStrategies. java) est une extension de V2CompatibleBackoffStrategyAdapter,

Etc. sont préparés. Lors de l'initialisation de RetryPolicy, il est possible de définir des paramètres détaillés en passant BackoffStrategy au constructeur.

Autre

C'est en fait un document officiel, et j'ai le sentiment qu'il y a quelque chose qui l'explique bien ... Je ne pouvais pas me trouver, alors j'apprécierais que vous puissiez indiquer s'il y avait quelque chose comme "Je suis désolé si j'ai lu ceci même si je ne peux pas le faire."

référence

Recommended Posts

[AWS SDK for Java] Définir la stratégie de nouvelle tentative pour le client S3
Configurer des cookies signés (pour CloudFront) avec des stratégies personnalisées à l'aide du kit AWS SDK pour Java
Informations d'identification référencées par le kit AWS SDK for Java par défaut
Crypter les données téléchargées vers S3 à l'aide du kit AWS SDK pour Java / SSE-KMS
Importer / télécharger / supprimer en bloc des données sur S3 à l'aide d'Amazon S3 Client Builder avec AWS SDK pour Java
Créer un référentiel Maven sur AWS S3
Vérifiez les options définies pour le processus Java en cours d'exécution
Jusqu'à ce que vous exécutiez un programme Java avec le SDK AWS local sur Windows
J'ai écrit un code de test (Junit & mockit) pour le code qui appelle l'API AWS (Java)
Remarque sur l'initialisation des champs dans le didacticiel Java
Obtenir la taille de l'objet S3 avec AWS SDK pour Ruby
Comment déployer une application kotlin (java) sur AWS Fargate
Essayez Spark Submit to EMR à l'aide du kit AWS SDK pour Java
Un mémorandum pour atteindre le lieu qui démange pour Java Gold
Accéder au compartiment S3 à l'aide du chiffrement SSE-KMS dans l'environnement de rôle IAM EC2 (AWS SDK pour Java)
Gérer la logique métier pour un ensemble d'entités dans une classe Java
Configurez facilement un serveur Jenkins sur AWS à l'aide de l'AMI de Bitnami
[Android Studio] Définir une image arbitraire pour l'arrière-plan de l'application [Java]
Comment vérifier le contenu de la chaîne de caractères java de longueur fixe