工作流和活动合同 - AWS Flow Framework 适用于 Java

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

工作流和活动合同

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 注释对此方法进行了注释,并且此方法必须具有返回类型 voidPromise<>。在给定工作流接口中,最多可以使用此注释对一个方法进行注释。此方法是工作流逻辑的入口点,并且框架在收到决策任务时会调用此方法来执行工作流逻辑。

工作流接口还定义可能发送给工作流的信号。在工作流执行收到具有匹配名称的信号时,会调用信号方法。例如,MyWorkflow 接口声明信号方法 signal1,使用 @Signal 注释对此方法进行了注释。

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

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

此外,您还可以在工作流接口中声明方法来报告工作流执行的最新状态,如上述示例中的 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> 或其衍生物。