在 Amazon SDK for Java 2.x 中对资源状态进行民意调查:Waiters - Amazon SDK for Java 2.x
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

在 Amazon SDK for Java 2.x 中对资源状态进行民意调查:Waiters

Amazon SDK for Java 2.x 的 waiters 实用程序使您能够在对这些 Amazon 资源执行操作之前验证这些资源是否处于指定状态。

服务员是一种抽象概念,用于轮询 Amazon 资源,例如 DynamoDB 表或 Amazon S3 存储桶,直到达到所需的状态(或者直到确定资源永远无法达到所需状态)。与其编写逻辑来持续轮询 Amazon 资源(这可能很繁琐且容易出错),不如使用服务员来轮询资源,让您的代码在资源准备就绪后继续运行。

先决条件

必须先完成设置 Amazon SDK for Java 2. x 中的步骤 Amazon SDK for Java,然后才能在项目中使用服务员。

您还必须将项目依赖项(例如,在您的 pom.xmlbuild.gradle 文件中)配置为使用 Amazon SDK for Java版本 2.15.0 或更高版本。

例如:

<project> <dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>bom</artifactId> <version>2.15.0</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)));

代码示例

有关将 waiters 与一起使用的完整示例 DynamoDB,请参阅 Amazon 代码示例CreateTable存储库中的.java。

有关使用服务员的完整示例 Amazon S3,请参阅 Amazon 代码示例存储库中的 S3 BucketOps .java。