

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

# アクティビティ実装
<a name="activityimpl"></a>

アクティビティを実装するには、`@Activities` インターフェイスの実装を提供します。 AWS Flow Framework for Java は、ワーカーで設定されたアクティビティ実装インスタンスを使用して、実行時にアクティビティタスクを処理します。ワーカーは適切なタイプのアクティビティ実装を自動的に見つけます。

アクティビティインスタンスにリソース (データベース接続など) を渡すには、プロパティやフィールドを使用できます。アクティビティ実装オブジェクトは複数のスレッドからアクセスできる可能性があるため、共有リソースはスレッドセーフである必要があります。

アクティビティ実装は、`Promise<>` 型のパラメータや、この型を戻り値の型として使用しないことに注意してください。アクティビティの実装は、呼び出し方法 (同期または非同期) に依存しないことが求められるためです。

前に示したアクティビティインターフェイスは次のように実装できます。

```
public class MyActivitiesImpl implements MyActivities {

   @Override
   @ManualActivityCompletion
   public int activity1(){
      //implementation
   }

   @Override
   public void activity2(int foo){
     //implementation
   }
}
```

アクティビティ実装では、スレッドローカルコンテキストを使用してタスクオブジェクトや使用するデータコンバータオブジェクトなどを取得できます。現在のコンテキストには、`ActivityExecutionContextProvider.getActivityExecutionContext()` を通じてアクセスできます。詳細については、「」の AWS SDK for Java ドキュメント`ActivityExecutionContext`と「」セクションを参照してください[実行コンテキスト](executioncontext.md)。

## マニュアルでのアクティビティの完了
<a name="activityimpl.complete"></a>

上の例の `@ManualActivityCompletion` 注釈は、オプションの注釈です。この注釈は、アクティビティを実装するメソッドでのみ使用できます。これにより、アクティビティメソッドが戻ったときにアクティビティが自動的に完了しないように設定します。これは、アクティビティを非同期的に完了する場合 (人間のアクションが完了した後でマニュアルで完了する場合など) に役立ちます。

デフォルトでは、アクティビティメソッドが戻ると、フレームワークではアクティブティを完了済みとみなします。つまり、アクティビティワーカーは Amazon SWF に対してアクティビティタスクの完了を報告し、その結果 (ある場合) を提供します。ただし、アクティビティメソッドが戻ったときに、アクティビティタスクを完了済みとしてマークしないように設定することもできます。これは人間のタスクをモデリングするときに特に便利です。たとえば、アクティビティタスクが完了する前に、仕事を完了する必要がある人に対して、アクティビティメソッドから E メールを送信する場合があります。このような場合、`@ManualActivityCompletion` 注釈を使用してアクティビティメソッドに注釈を設定し、アクティビティを自動的に完了しないようにアクティビティワーカーに指示できます。アクティビティをマニュアルで完了するには、フレームワークに用意されている `ManualActivityCompletionClient` を使用するか、Amazon SWF SDK に用意されている Amazon SWF Java クライアントの `RespondActivityTaskCompleted` メソッドを使用できます。詳細については、 AWS SDK for Java ドキュメントを参照してください。

アクティビティタスクを完了するには、タスクトークンを指定する必要があります。タスクトークンは、タスクを一意に識別するために Amazon SWF によって使用されます。このトークンには、アクティビティ実装の `ActivityExecutionContext` からアクセスできます。タスクを完了する当事者に、このトークンを渡す必要があります。このトークンを `ActivityExecutionContext` から取得するには、`ActivityExecutionContextProvider.getActivityExecutionContext().getTaskToken()` を呼び出します。

Hello World 例の `getName` アクティビティを実装することで、挨拶メッセージを提供するように誰かに依頼する E メールを送信できます。

```
@ManualActivityCompletion
@Override
public String getName() throws InterruptedException {
    ActivityExecutionContext executionContext
         = contextProvider.getActivityExecutionContext();
    String taskToken = executionContext.getTaskToken();
    sendEmail("abc@xyz.com",
         "Please provide a name for the greeting message and close task with token: " + taskToken);
    return "This will not be returned to the caller";
}
```

次のコードスニペットでは、挨拶を提供した後で、`ManualActivityCompletionClient` を使用してタスクを終了できます。または、タスクを失敗させることもできます。

```
public class CompleteActivityTask {

    public void completeGetNameActivity(String taskToken) {

        AmazonSimpleWorkflow swfClient
           = new AmazonSimpleWorkflowClient(...); // use AWS access keys
        ManualActivityCompletionClientFactory manualCompletionClientFactory
           = new ManualActivityCompletionClientFactoryImpl(swfClient);
        ManualActivityCompletionClient manualCompletionClient
           = manualCompletionClientFactory.getClient(taskToken);
        String result = "Hello World!";
        manualCompletionClient.complete(result);
    }

    public void failGetNameActivity(String taskToken, Throwable failure) {
        AmazonSimpleWorkflow swfClient
           = new AmazonSimpleWorkflowClient(...); // use AWS access keys
        ManualActivityCompletionClientFactory manualCompletionClientFactory
           = new ManualActivityCompletionClientFactoryImpl(swfClient);
        ManualActivityCompletionClient manualCompletionClient
           = manualCompletionClientFactory.getClient(taskToken);
        manualCompletionClient.fail(failure);
    }
}
```