

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

# 工作流和活动合同
<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` 接口声明信号方法 `signal1`，使用 `@Signal` 注释对此方法进行了注释。

在信号方法上需要 `@Signal` 注释。信号方法的返回类型必须是 `void`。工作流接口中可以定义零个或多个信号方法。您可以声明没有 `@Execute` 方法但有一些 `@Signal` 方法的工作流接口，以生成无法启动其执行但可以向正在运行的执行发送信号的客户端。

使用 `@Execute` 和 `@Signal` 注释进行注释的方法可以具有除 `Promise<T>` 或其衍生物之外的任何类型的任何数量的参数。这允许您在工作流执行启动时和正在运行时向其传递强类型输入。`@Execute` 方法的返回类型必须是 `void` 或 `Promise<>`。

此外，您还可以在工作流接口中声明方法来报告工作流执行的最新状态，如上述示例中的 `getState` 方法。此状态不是工作流的整个应用程序状态。此功能的预期用途是允许您存储最多 32 KB 的数据来指示执行的最新状态。例如，在订单处理工作流中，您可以存储一个字符串来指示订单已收到、已处理或已取消。框架在每次完成一个决策任务时就会调用此方法来获取最新状态。状态存储在 Amazon Simple Workﬂow 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>` 或其衍生物。