

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 在 中使用等待程式 AWS SDK for Java 2.x
<a name="waiters"></a>

 適用於 Java 的 AWS SDK 2.x 的等待程式公用程式可讓您在對 AWS 這些資源執行操作之前，先驗證資源是否處於指定的狀態。

*等待程式*是用來輪詢 AWS 資源的抽象，例如 DynamoDB 資料表或 Amazon S3 儲存貯體，直到達到所需的狀態 （或直到確定資源永遠不會達到所需的狀態）。您可以使用等待程式輪詢資源，並讓程式碼在資源準備就緒後繼續執行，而不是編寫邏輯來持續輪詢 AWS 可能很繁瑣且容易出錯的資源。

## 先決條件
<a name="prerequisiteswaiters"></a>

您必須先完成[設定 適用於 Java 的 AWS SDK 2.x](setup.md) 中的步驟 適用於 Java 的 AWS SDK，才能在專案中使用等待程式。

您也必須將專案相依性 （例如，在您的 `pom.xml`或 `build.gradle` 檔案中） 設定為使用 版本 `2.15.0` 或更新版本 適用於 Java 的 AWS SDK。

例如：

```
<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>
```

## 使用等待程式
<a name="id1waiters"></a>

若要執行個體化等待程式物件，請先建立服務用戶端。將服務用戶端的 `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();
```

## 設定等待程式
<a name="configuring-waiters"></a>

您可以使用其建置器`overrideConfiguration()`上的 來自訂等待程式的組態。對於某些操作，您可以在提出請求時套用自訂組態。

### 設定等待程式
<a name="configure-a-waiter"></a>

下列程式碼片段顯示如何覆寫等待程式上的組態。

```
// 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.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>

如需搭配 使用等待程式的完整範例 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 程式碼範例儲存庫中的 [S3BucketOps.java](https://github.com/awsdocs/aws-doc-sdk-examples/blob/869b7ddbc7c8f66c7c45acd5b813429aff37003e/javav2/example_code/s3/src/main/java/com/example/s3/S3BucketOps.java)。