

 AWS SDK for Java 1.x は 2025 年 12 月 31 日にend-of-supportしました。新しい機能、可用性の向上、セキュリティ更新のために、[AWS SDK for Java 2.x](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/home.html) に移行することをお勧めします。

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# 非同期プログラミング
<a name="basics-async"></a>

*同期*メソッドまたは*非同期*メソッドを使用して、 AWS サービスのオペレーションを呼び出すことができます。同期メソッドは、クライアントがサービスからのレスポンスを受信するまでスレッドの実行をブロックします。非同期メソッドはすぐに応答を返し、レスポンスを待機せずに呼び出しスレッドに制御を戻します。

非同期メソッドはレスポンスが可能になる前に応答を返すため、準備ができたらレスポンスを得るための手段が必要になります。 AWS SDK for Java には、*将来のオブジェクト*と*コールバックメソッド*の 2 つの方法があります。

## Java Future
<a name="basics-async-future"></a>

の非同期メソッドは、*将来の*非同期オペレーションの結果を含む [Future](https://docs.oracle.com/javase/8/docs/api/index.html?java/util/concurrent/Future.html) オブジェクト AWS SDK for Java を返します。

`Future` `isDone()` メソッドを呼び出し、サービスが既に応答オブジェクトを提供したかどうかを確認します。レスポンスの準備が整うと、`Future` `get()` メソッドを呼び出して応答オブジェクトを取得できます。このメカニズムを使用して、アプリケーションで他の動作を続行しながら、定期的に非同期オペレーションの結果をポーリングすることができます。

[InvokeResult](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/lambda/model/InvokeResult.html) オブジェクトを保持`Future`できる を受け取る Lambda 関数を呼び出す非同期オペレーションの例を次に示します。`InvokeResult` オブジェクトは、`isDone()` が `true` になった後に限り取得されます。

```
import com.amazonaws.services.lambda.AWSLambdaAsyncClient;
import com.amazonaws.services.lambda.model.InvokeRequest;
import com.amazonaws.services.lambda.model.InvokeResult;
import java.nio.ByteBuffer;
import java.util.concurrent.Future;
import java.util.concurrent.ExecutionException;

public class InvokeLambdaFunctionAsync
{
    public static void main(String[] args)
    {
        String function_name = "HelloFunction";
        String function_input = "{\"who\":\"SDK for Java\"}";

        AWSLambdaAsync lambda = AWSLambdaAsyncClientBuilder.defaultClient();
        InvokeRequest req = new InvokeRequest()
            .withFunctionName(function_name)
            .withPayload(ByteBuffer.wrap(function_input.getBytes()));

        Future<InvokeResult> future_res = lambda.invokeAsync(req);

        System.out.print("Waiting for future");
        while (future_res.isDone() == false) {
            System.out.print(".");
            try {
                Thread.sleep(1000);
            }
            catch (InterruptedException e) {
                System.err.println("\nThread.sleep() was interrupted!");
                System.exit(1);
            }
        }

        try {
            InvokeResult res = future_res.get();
            if (res.getStatusCode() == 200) {
                System.out.println("\nLambda function returned:");
                ByteBuffer response_payload = res.getPayload();
                System.out.println(new String(response_payload.array()));
            }
            else {
                System.out.format("Received a non-OK response from {AWS}: %d\n",
                        res.getStatusCode());
            }
        }
        catch (InterruptedException | ExecutionException e) {
            System.err.println(e.getMessage());
            System.exit(1);
        }

        System.exit(0);
    }
}
```

## 非同期コールバック
<a name="basics-async-callback"></a>

Java `Future` オブジェクトを使用して非同期リクエストのステータスをモニタリングすることに加え、SDK には [AsyncHandler](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/handlers/AsyncHandler.html) インターフェイスを使用するクラスを実装することができます。`AsyncHandler` では、リクエストがどのように完了したかに応じて呼び出される 2 つのメソッド、`onSuccess` および `onError` が提供されます。

コールバックインターフェイスアプローチの主な利点は、リクエストがいつ完了したかを調べるために `Future` オブジェクトをポーリングする必要がなくなることです。コードによってすぐに次のアクティビティを開始でき、また SDK に依存してハンドラを適時に呼び出すことができます。

```
import com.amazonaws.services.lambda.AWSLambdaAsync;
import com.amazonaws.services.lambda.AWSLambdaAsyncClientBuilder;
import com.amazonaws.services.lambda.model.InvokeRequest;
import com.amazonaws.services.lambda.model.InvokeResult;
import com.amazonaws.handlers.AsyncHandler;
import java.nio.ByteBuffer;
import java.util.concurrent.Future;

public class InvokeLambdaFunctionCallback
{
    private class AsyncLambdaHandler implements AsyncHandler<InvokeRequest, InvokeResult>
    {
        public void onSuccess(InvokeRequest req, InvokeResult res) {
            System.out.println("\nLambda function returned:");
            ByteBuffer response_payload = res.getPayload();
            System.out.println(new String(response_payload.array()));
            System.exit(0);
        }

        public void onError(Exception e) {
            System.out.println(e.getMessage());
            System.exit(1);
        }
    }

    public static void main(String[] args)
    {
        String function_name = "HelloFunction";
        String function_input = "{\"who\":\"SDK for Java\"}";

        AWSLambdaAsync lambda = AWSLambdaAsyncClientBuilder.defaultClient();
        InvokeRequest req = new InvokeRequest()
            .withFunctionName(function_name)
            .withPayload(ByteBuffer.wrap(function_input.getBytes()));

        Future<InvokeResult> future_res = lambda.invokeAsync(req, new AsyncLambdaHandler());

        System.out.print("Waiting for async callback");
        while (!future_res.isDone() && !future_res.isCancelled()) {
            // perform some other tasks...
            try {
                Thread.sleep(1000);
            }
            catch (InterruptedException e) {
                System.err.println("Thread.sleep() was interrupted!");
                System.exit(0);
            }
            System.out.print(".");
        }
    }
}
```

## ベストプラクティス
<a name="basics-async-tips"></a>

### コールバックの実行
<a name="callback-execution"></a>

`AsyncHandler` の実装は、非同期クライアントが所有するスレッドプール内で実行されます。素早く実行される短いコードが `AsyncHandler` 実装内で最も適しています。ハンドラメソッド内の長期実行コードまたはブロックコードにより、非同期クライアントが使用するスレッドプールの競合が起こり、クライアントのリクエスト実行が妨げられる場合があります。コールバックで始める必要がある長期実行タスクがある場合は、コールバックを新しいスレッドで、またはアプリケーションが管理するスレッドプールで実行します。

### スレッドプールの構成
<a name="thread-pool-configuration"></a>

の非同期クライアントは、ほとんどのアプリケーションで機能するデフォルトのスレッドプール AWS SDK for Java を提供します。カスタム [ExecutorService](https://docs.oracle.com/javase/8/docs/api/index.html?java/util/concurrent/ExecutorService.html) を実装し、 AWS SDK for Java 非同期クライアントに渡して、スレッドプールの管理方法をより詳細に制御できます。

たとえば、カスタムの `ExecutorService`ThreadFactory[ を使用する ](https://docs.oracle.com/javase/8/docs/api/index.html?java/util/concurrent/ThreadFactory.html) 実装を提供し、プールのスレッドの命名方法を制御したり、スレッドの使用に関する追加情報のログを記録したりできます。

### 非同期アクセス
<a name="s3-asynchronous-access"></a>

SDK の [TransferManager](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/s3/transfer/TransferManager.html) クラスは、 を操作するための非同期サポートを提供します Amazon S3。 は非同期アップロードとダウンロード`TransferManager`を管理し、転送に関する詳細な進行状況レポートを提供し、さまざまなイベントへのコールバックをサポートします。