

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

# 活動實作
<a name="activityimpl"></a>

以提供 `@Activities` 界面的實作來實作活動。 AWS Flow Framework 適用於 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` 存取此字符。您必須將此字符傳遞到負責完成任務的一方。您可從 `ActivityExecutionContext` 呼叫 `ActivityExecutionContextProvider.getActivityExecutionContext().getTaskToken()` 來擷取此字符。

您可實作 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);
    }
}
```