本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
在AWS SDK for Java 2.x 中使用 Waiter
AWS SDK for Java 2.x 的 waiter 实用程序使您能够在对 AWS 资源执行操作之前验证这些资源是否处于指定状态。
waiter 是一个抽象,用于轮询 AWS 资源,例如 DynamoDB 表或 Amazon S3 桶,直到达到所需的状态(或者直到确定资源永远无法达到所需状态)。编写逻辑来持续轮询 AWS 资源可能很繁琐且容易出错,而使用 waiter 来轮询资源,则可让您的代码在资源准备就绪后继续运行。
先决条件
必须先完成设置AWS SDK for Java 2.x 中的步骤,然后才能在AWS SDK for Java 项目中使用 waiter。
您还必须将项目依赖项(例如,在您的 pom.xml 或 build.gradle 文件中)配置为使用AWS SDK for Java 版本 2.15.0 或更高版本。
例如:
<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>
使用 Waiter
要实例化 waiter 对象,请先创建一个服务客户端。将服务客户端的 waiter() 方法设置为 waiter 对象的值。waiter 实例存在后,设置其响应选项以执行相应的代码。
同步编程
以下代码段演示了如何等待 DynamoDB 表存在并处于 ACTIVE 状态。
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);
异步编程
以下代码段演示了如何等待 DynamoDB 表不再存在。
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();
配置 Waiter
您可以使用 waiter 的生成器上的 overrideConfiguration(),为 waiter 自定义配置。对于某些操作,您可以在发出请求时应用自定义配置。
配置 Waiter
以下代码段演示如何覆盖 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();
覆盖特定请求的配置
以下代码段演示如何根据每个请求覆盖 waiter 的配置。请注意,只有某些操作具有可自定义的配置。
waiter.waitUntilTableNotExists(b -> b.tableName("myTable"), o -> o.maxAttempts(10)); asyncWaiter.waitUntilTableExists(b -> b.tableName("myTable"), o -> o.waitTimeout(Duration.ofMinutes(1)));
代码示例
有关将 waiter 与 DynamoDB 结合使用的完整示例,请参阅 AWS 代码示例存储库中的 CreateTable.java
有关将 waiter 与 Amazon S3 结合使用的完整示例,请参阅 AWS 代码示例存储库中的 S3BucketOps.java