Usar waiters no AWS SDK for Java 2.x
O utilitário waiters do AWS SDK para Java 2.x permite que você valide se os recursos da AWS estão em um estado especificado antes de realizar operações nesses recursos.
Um waiter é uma abstração usada para pesquisar recursos da AWS, como DynamoDB tabelas ou buckets do Amazon S3, até que o estado desejado seja alcançado (ou até que seja determinado que o recurso nunca alcançará o estado desejado). Em vez de escrever uma lógica para pesquisar continuamente seus recursos da AWS, o que pode ser complicado e propenso a erros, você pode usar waiters para pesquisar um recurso e fazer com que seu código continue sendo executado depois que o recurso estiver pronto.
Pré-requisitos
Antes de usar waiters em um projeto com o AWS SDK para Java, você deve concluir as etapas em Configurar o AWS SDK para Java 2.x.
Você também deve configurar as dependências do projeto (por exemplo, no seu arquivo pom.xml ou build.gradle) para usar a versão 2.15.0 ou posterior do AWS SDK para Java.
Por exemplo:
<project> <dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>bom</artifactId> <version>2.27.21</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> </project>
Usar agentes de espera
Para instanciar um objeto de waiters, primeiro crie um cliente de serviço. Defina o método waiter() do cliente de serviço como o valor do objeto waiter. Quando a instância do waiter existir, defina suas opções de resposta para executar o código apropriado.
Programação síncrona
O trecho de código a seguir mostra como esperar que uma tabela do DynamoDB exista e esteja em um estado ATIVO.
DynamoDbClient dynamo = DynamoDbClient.create(); DynamoDbWaiter waiter = dynamo.waiter(); WaiterResponse<DescribeTableResponse> waiterResponse = waiter.waitUntilTableExists(r -> r.tableName("myTable")); // print out the matched response with a tableStatus of ACTIVE waiterResponse.matched().response().ifPresent(System.out::println);
Programação assíncrona
O trecho de código a seguir mostra como esperar que uma tabela do DynamoDB não exista mais.
DynamoDbAsyncClient asyncDynamo = DynamoDbAsyncClient.create(); DynamoDbAsyncWaiter asyncWaiter = asyncDynamo.waiter(); CompletableFuture<WaiterResponse<DescribeTableResponse>> waiterResponse = asyncWaiter.waitUntilTableNotExists(r -> r.tableName("myTable")); waiterResponse.whenComplete((r, t) -> { if (t == null) { // print out the matched ResourceNotFoundException r.matched().exception().ifPresent(System.out::println); } }).join();
Configurar waiters
Você pode personalizar a configuração de um waiter usando o overrideConfiguration() em seu construtor. Para algumas operações, você pode aplicar uma configuração personalizada ao fazer a solicitação.
Configurar um waiter
O trecho de código a seguir mostra como substituir a configuração em um waiter.
// sync DynamoDbWaiter waiter = DynamoDbWaiter.builder() .overrideConfiguration(b -> b.maxAttempts(10)) .client(dynamoDbClient) .build(); // async DynamoDbAsyncWaiter asyncWaiter = DynamoDbAsyncWaiter.builder() .client(dynamoDbAsyncClient) .overrideConfiguration(o -> o.backoffStrategy( FixedDelayBackoffStrategy.create(Duration.ofSeconds(2)))) .scheduledExecutorService(Executors.newScheduledThreadPool(3)) .build();
Substituir configuração para uma solicitação específica
O trecho de código a seguir mostra como substituir a configuração de um waiter por solicitação. Observe que somente algumas operações têm configurações personalizáveis.
waiter.waitUntilTableNotExists(b -> b.tableName("myTable"), o -> o.maxAttempts(10)); asyncWaiter.waitUntilTableExists(b -> b.tableName("myTable"), o -> o.waitTimeout(Duration.ofMinutes(1)));
Exemplos de código
Para ver um exemplo completo do uso de waiters com o DynamoDB, consulte CreateTable.java
Para ver um exemplo completo do uso de waiters com o Amazon S3, consulte S3BucketOps.java