

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

# 在中使用服务员 AWS SDK for Java 2.x
<a name="waiters"></a>

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

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

## 先决条件
<a name="prerequisiteswaiters"></a>

必须先完成[设置 适用于 Java 的 AWS SDK 2.](setup.md) x 中的步骤 适用于 Java 的 AWS SDK，然后才能在项目中使用服务员。

您还必须将项目依赖项（例如，在您的 `pom.xml` 或 `build.gradle` 文件中）配置为使用 适用于 Java 的 AWS SDK版本 `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
<a name="id1waiters"></a>

要实例化 waiter 对象，请先创建一个服务客户端。将服务客户端的 `waiter()` 方法设置为 waiter 对象的值。waiter 实例存在后，设置其响应选项以执行相应的代码。

### 同步编程
<a name="synchronous-programming"></a>

以下代码片段显示了如何等待 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);
```

### 异步编程
<a name="asynchronous-programming"></a>

以下代码片段显示了如何等待 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
<a name="configuring-waiters"></a>

您可以使用 waiter 的生成器上的 `overrideConfiguration()`，为 waiter 自定义配置。对于某些操作，您可以在发出请求时应用自定义配置。

### 配置 Waiter
<a name="configure-a-waiter"></a>

以下代码段演示如何覆盖 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();
```

### 覆盖特定请求的配置
<a name="override-configuration-for-a-specific-request"></a>

以下代码段演示如何根据每个请求覆盖 waiter 的配置。请注意，只有某些操作具有可自定义的配置。

```
waiter.waitUntilTableNotExists(b -> b.tableName("myTable"),
               o -> o.maxAttempts(10));

asyncWaiter.waitUntilTableExists(b -> b.tableName("myTable"),
                 o -> o.waitTimeout(Duration.ofMinutes(1)));
```

## 代码示例
<a name="code-examples"></a>

有关将 waiters 与一起使用的完整示例 DynamoDB，请参阅 AWS 代码示例[CreateTable存储库中的.java。](https://github.com/awsdocs/aws-doc-sdk-examples/blob/869b7ddbc7c8f66c7c45acd5b813429aff37003e/javav2/example_code/dynamodb/src/main/java/com/example/dynamodb/CreateTable.java)

有关使用服务员的完整示例 Amazon S3，请参阅 AWS 代码示例[存储库中的 S3 BucketOps .java。](https://github.com/awsdocs/aws-doc-sdk-examples/blob/869b7ddbc7c8f66c7c45acd5b813429aff37003e/javav2/example_code/s3/src/main/java/com/example/s3/S3BucketOps.java)