

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

# 活动实现
<a name="activityimpl"></a>

通过提供 `@Activities` 接口的实现来实现活动。f AWS Flow Framework or Java 使用在工作器上配置的活动实现实例在运行时处理活动任务。工作线程会自动查找适当类型的活动实现。

您可以使用属性和字段来将资源传递给活动实例，如数据库连接。由于可以从多个线程访问活动实现对象，因此共享资源必须是线程安全的。

请注意，活动实现不使用 `Promise<>` 类型的参数或返回该类型的对象。这是因为活动的实现不应依赖它的调用方式 (同步或异步)。

之前显示的活动接口可按如下方式实现：

```
public class MyActivitiesImpl implements MyActivities {

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

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

可以向活动实现提供线程本地上下文，这可用于检索任务对象、所使用的数据转换器对象等。可通过 `ActivityExecutionContextProvider.getActivityExecutionContext()` 访问当前上下文。有关更多详细信息，请参阅的 适用于 Java 的 AWS SDK 文档`ActivityExecutionContext`和部分[执行关联](executioncontext.md)。

## 手动完成活动
<a name="activityimpl.complete"></a>

以上示例中的 `@ManualActivityCompletion` 注释是可选注释。仅在实现活动的方法上允许它，用于将活动配置为不在活动方法返回时自动完成。如果您想异步完成活动，例如，在人工操作完成后手动完成活动，这会非常有用。

默认情况下，当您的活动方法返回时，框架认为活动已完成。这意味着活动工作线程会向 Amazon SWF 报告活动任务已完成，并向其提供结果（如果有）。但是，在一些使用案例中，您不希望在活动方法返回时将活动任务标记为已完成。在为人工任务建模时，这尤其有用。例如，活动方法可能将电子邮件发送给某人，该人必须完成某些工作，活动任务才能完成。在这种情况下，您可以使用 `@ManualActivityCompletion` 注释来注释此活动方法以告诉活动工作线程它不应自动完成活动。要手动完成活动，您可以使用框架中提供的 `ManualActivityCompletionClient` 或使用 Amazon SWF SDK 中提供的 Amazon SWF Java 客户端上的 `RespondActivityTaskCompleted` 方法。有关更多详细信息，请参阅 适用于 Java 的 AWS SDK 文档。

要完成活动任务，您需要提供任务令牌。Amazon SWF 会使用任务令牌来唯一标识任务。您可以从活动实现中的 `ActivityExecutionContext` 访问此令牌。您必须将此令牌传递给负责完成任务的一方。可以通过调用 `ActivityExecutionContextProvider.getActivityExecutionContext().getTaskToken()` 来从 `ActivityExecutionContext` 检索此令牌。

Hello World 示例的 `getName` 活动可实现为发送电子邮件来要求某人提供问候语：

```
@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);
    }
}
```