

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

# 工作流程和活動合約
<a name="features.workflow"></a>

Java 界面是用來宣告工作流程和活動的簽章。界面形成工作流程 (或活動) 實作與該工作流程 (或活動) 之用戶端之間的合約。例如，使用標註 `@Workflow` 註釋的界面來定義工作流程類型 `MyWorkflow`：

```
@Workflow
@WorkflowRegistrationOptions(
   defaultExecutionStartToCloseTimeoutSeconds = 60,
   defaultTaskStartToCloseTimeoutSeconds = 10)
public interface MyWorkflow
{
    @Execute(version = "1.0")
    void startMyWF(int a, String b);

    @Signal
    void signal1(int a, int b, String c);

    @GetState
    MyWorkflowState getState();
}
```

合約沒有實作專屬設定。這項實作本質合約的使用允許用戶端與實作脫離，從而能彈性地變更實作詳細資訊而不中斷用戶端。您也可以換成變更用戶端，而不需要變更所使用的工作流程或活動。例如，可能會修改用戶端以 Promise (`Promise<T>`) 非同步呼叫活動，而不需要變更活動實作。同樣地，活動實作可能會變更，以便非同步完成，例如由傳送電子郵件的人員完成，而無需變更活動的用戶端。

在上面的範例中，工作流程界面 `MyWorkflow` 包含 `startMyWF` 方法來啟動新的執行。此方法會標註 `@Execute` 註釋，而且必須具有傳回類型 `void` 或 `Promise<>`。在指定的工作流程界面中，最多一種方法可以標註此註釋。此方法是工作流程邏輯的進入點，而且框架會在收到決策任務時呼叫此方法，以執行工作流程邏輯。

工作流程界面也會定義可能傳送至工作流程的訊號。工作流程執行在收到具有相符名稱的訊號時，便會呼叫訊號方法。例如，`MyWorkflow` 界面會宣告已標註 `@Signal` 註釋的訊號方法 `signal1`。

訊號方法上需要有 `@Signal` 註釋。訊號方法的傳回類型必須是 `void`。工作流程界面中可以定義零或多個訊號方法。您可宣告未有 `@Execute` 方法及含有一些 `@Signal` 方法的工作流程界面，藉此產生無法啟動執行但可將訊號傳送至運作中之執行的用戶端。

已標註 `@Execute` 和 `@Signal` 註釋的方法可能有 `Promise<T>` 或其衍生物以外任何類型之任意數目的參數。這可讓您在啟動及執行時將強類型輸入傳遞至工作流程執行。`@Execute` 方法的傳回類型必須是 `void` 或 `Promise<>`。

此外，您也可以在工作流程界面中宣告方法，以報告工作流程執行的最新狀態 (例如，先前範例中的 `getState` 方法)。此狀態不是工作流程的整個套用狀態。此功能的預定用途是可讓您最多存放 32 KB 的資料，指出執行的最新狀態。例如，在訂單處理工作流程中，您可以存放字串，以指出收到、處理或取消的訂單。每次在決策任務完成之時，框架就會呼叫此方法以取得最新狀態。狀態存放在 Amazon Simple Workflow Service (Amazon SWF) 中，並且可以使用產生的外部用戶端擷取。這可讓您檢查工作流程執行的最新狀態。已標註 `@GetState` 的方法不得採用任何引數，而且不得具有 `void` 傳回類型。您可以從此方法傳回任何符合您需求的類型。在上述範例中，用來存放字串狀態和完成百分比數值的方法會傳回 `MyWorkflowState` 的物件 (請參閱下面的定義)。此方法預期會對工作流程實作物件執行唯讀存取，並且進行同步呼叫，以禁止使用任何非同步操作 (例如呼叫已標註 `@Asynchronous` 的方法)。工作流程界面中最多一種方法能夠標註 `@GetState` 註釋。

```
public class MyWorkflowState {
   public String status;
   public int percentComplete;
}
```

同樣地，會使用已標註 `@Activities` 註釋的界面來定義一組活動。介面中的每個方法都會對應至 活動，例如：

```
@Activities(version = "1.0")
@ActivityRegistrationOptions(
     defaultTaskScheduleToStartTimeoutSeconds = 300,
     defaultTaskStartToCloseTimeoutSeconds = 3600)
public interface MyActivities {
    // Overrides values from annotation found on the interface
    @ActivityRegistrationOptions(description = "This is a sample activity",
         defaultTaskScheduleToStartTimeoutSeconds = 100,
         defaultTaskStartToCloseTimeoutSeconds = 60)
    int activity1();

    void activity2(int a);
}
```

此界面可讓您為相關的活動分組。您可以在活動界面內定義任意數目的活動，且您可以定義所需數目的活動界面。與 `@Execute` 和 `@Signal` 方法類似，活動方法可以採用 `Promise<T>` 或其衍生物以外任何類型之任意數目的引數。活動的傳回類型不得是 `Promise<T>` 或其衍生物。