使用 Step Functions 创建活动状态机 - Amazon Step Functions
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

使用 Step Functions 创建活动状态机

本教程介绍如何使用 Java 和 Amazon Step Functions 创建基于活动的状态机。活动允许您控制在状态机中的其他位置运行的工作程序代码。有关概述,请参阅 了解 Step Functions 中的活动中的了解 Step Functions 中的状态机

要完成本教程,您需要:

  • 适用于 Java 的 SDK。本教程中的示例活动是 Java 应用程序,该应用程序使用 适用于 Java 的 Amazon SDK 与 Amazon 通信。

  • 环境中或标准 Amazon 配置文件中的 Amazon 凭证。有关更多信息,请参阅《适用于 Java 的 Amazon SDK 开发人员指南》中的设置您的 Amazon 凭证

第 1 步:创建活动

您必须让 Step Functions 知道某项活动,您希望创建该活动的工作线程(一个程序)。Step Functions 使用为活动建立身份的 Amazon 资源名称 (ARN) 作为响应。可以使用此身份协调状态机与工作线程之间传递的信息。

重要

确保您的活动任务与状态机属于同一个 Amazon 帐户。

  1. Step Functions 控制台左侧的导航窗格中,选择活动

  2. 选择创建活动

  3. 输入活动的名称,例如 get-greeting,然后选择创建活动

  4. 创建活动任务时,请记下其 ARN,如以下示例所示。

    arn:aws:states:region:123456789012:activity:get-greeting

第 2 步:创建状态机

创建一个状态机,该状态机确定什么时候调用活动以及什么时候工作线程执行其主要工作,收集其结果并返回这些结果。要创建状态机,您需要使用 Workflow Studio 的代码编辑器

  1. Step Functions 控制台左侧的导航窗格中,选择状态机

  2. 状态机页面上,选择创建状态机

  3. 选择从空白创建

  4. 为状态机命名,然后选择继续,在 Workflow Studio 中编辑状态机。

  5. 在本教程中,您将在代码编辑器中编写状态机的 Amazon States Language (ASL) 定义。要执行此操作,请选择代码

  6. 删除现有的样板代码并粘贴以下代码。请记住将 Resource 字段中的示例 ARN 替换为您之前在第 1 步:创建活动中创建的活动任务的 ARN。

    { "Comment": "An example using a Task state.", "StartAt": "getGreeting", "Version": "1.0", "TimeoutSeconds": 300, "States": { "getGreeting": { "Type": "Task", "Resource": "arn:aws:states:region:123456789012:activity:get-greeting", "End": true } } }

    这是使用 Amazon States Language(ASL)的状态机的说明。它定义了名为 Task 的单个 getGreeting 状态。有关更多信息,请参阅状态机结构

  7. 图形可视化 上,确保您添加的 ASL 定义的工作流图表与下图相似。

    带有 RunActivity 任务状态的状态机的图形可视化。
  8. 为状态机指定一个名称。要执行此操作,请选择默认状态机名称 MyStateMachine 旁边的编辑图标。然后,找到状态机配置,在状态机名称框中指定一个名称。

    对于本教程,请输入名称 ActivityStateMachine

  9. (可选)在状态机配置中,指定其他工作流设置,例如状态机类型及其执行角色。

    在本教程中,请保留状态机设置中的所有默认选项。

    如果您之前为状态机创建了具有正确权限的 IAM 角色并想使用该角色,请在权限中选择选择现有角色,然后从列表中选择一个角色。或者选择输入角色 ARN,然后为该 IAM 角色的 ARN 获取该角色。

  10. 确认角色创建对话框中,选择确认继续。

    您也可以选择查看角色设置,返回至状态机配置

    注意

    如果您删除了 Step Functions 创建的 IAM 角色,Step Functions 在以后无法重新创建该角色。同样,如果您修改了该角色(例如,通过在 IAM 策略中从主体中删除 Step Functions),Step Functions 在以后也无法还原其原始设置。

第 3 步:实现工作线程

创建工作线程。工作线程是负责以下事务的程序:

  • 使用 GetActivityTask API 操作在 Step Functions 中轮询活动。

  • 使用您的代码执行活动的工作(例如,以下代码中的 getGreeting() 方法)。

  • 使用 SendTaskSuccessSendTaskFailureSendTaskHeartbeat API 操作返回结果。

注意

有关活动工作线程的更完整示例,请参阅示例:Ruby 中的活动工作线程。该示例提供了一个基于最佳实操的实现,您可以参考它创建自己的活动工作线程。这段代码实现了消费者/生产者模型,并且允许对轮询器和活动工作线程的线程数进行配置。

实施工作线程

  1. 创建一个名为 GreeterActivities.java的文件。

  2. 将以下代码添加到其中。

    import com.amazonaws.ClientConfiguration; import com.amazonaws.auth.EnvironmentVariableCredentialsProvider; import com.amazonaws.regions.Regions; import com.amazonaws.services.stepfunctions.AWSStepFunctions; import com.amazonaws.services.stepfunctions.AWSStepFunctionsClientBuilder; import com.amazonaws.services.stepfunctions.model.GetActivityTaskRequest; import com.amazonaws.services.stepfunctions.model.GetActivityTaskResult; import com.amazonaws.services.stepfunctions.model.SendTaskFailureRequest; import com.amazonaws.services.stepfunctions.model.SendTaskSuccessRequest; import com.amazonaws.util.json.Jackson; import com.fasterxml.jackson.databind.JsonNode; import java.util.concurrent.TimeUnit; public class GreeterActivities { public String getGreeting(String who) throws Exception { return "{\"Hello\": \"" + who + "\"}"; } public static void main(final String[] args) throws Exception { GreeterActivities greeterActivities = new GreeterActivities(); ClientConfiguration clientConfiguration = new ClientConfiguration(); clientConfiguration.setSocketTimeout((int)TimeUnit.SECONDS.toMillis(70)); AWSStepFunctions client = AWSStepFunctionsClientBuilder.standard() .withRegion(Regions.US_EAST_1) .withCredentials(new EnvironmentVariableCredentialsProvider()) .withClientConfiguration(clientConfiguration) .build(); while (true) { GetActivityTaskResult getActivityTaskResult = client.getActivityTask( new GetActivityTaskRequest().withActivityArn(ACTIVITY_ARN)); if (getActivityTaskResult.getTaskToken() != null) { try { JsonNode json = Jackson.jsonNodeOf(getActivityTaskResult.getInput()); String greetingResult = greeterActivities.getGreeting(json.get("who").textValue()); client.sendTaskSuccess( new SendTaskSuccessRequest().withOutput( greetingResult).withTaskToken(getActivityTaskResult.getTaskToken())); } catch (Exception e) { client.sendTaskFailure(new SendTaskFailureRequest().withTaskToken( getActivityTaskResult.getTaskToken())); } } else { Thread.sleep(1000); } } } }
    注意

    该示例中的 EnvironmentVariableCredentialsProvider 类假定已设置了 AWS_ACCESS_KEY_ID(或 AWS_ACCESS_KEY)和 AWS_SECRET_KEY(或 AWS_SECRET_ACCESS_KEY)环境变量。有关向工厂提供所需凭证的更多信息,请参阅《适用于 Java 的 Amazon SDK API 参考》中的 AWSCredentialsProvider《适用于 Java 的 Amazon SDK 开发人员指南》中的设置用于开发的 Amazon 凭证和区域

    默认情况下,Amazon 开发工具包将等待多达 50 秒,以从服务器接收任何操作的数据。GetActivityTask 操作是一个长时间运行的轮询操作,对于下一个可用任务将等待多达 60 秒。要防止收到 SocketTimeoutException 错误,请将 SocketTimeout 设置为 70 秒。

  3. GetActivityTaskRequest().withActivityArn() 构造函数的参数列表中,将 ACTIVITY_ARN 值替换为您之前在第 1 步:创建活动中创建的活动任务的 ARN。

第 4 步:运行状态机

开始执行状态机时,您的工作线程在 Step Functions 中轮询活动,执行其工作(使用您提供的输入)并返回其结果。

  1. ActivityStateMachine 页面上,选择启动执行

    随即显示启动执行对话框。

  2. 启动执行对话框中,执行以下操作:

    1. (可选)输入自定义执行名称,以便覆盖生成的默认执行名称。

      非 ASCII 名称和日志记录

      Step Functions 对于状态机、执行、活动和标签接受包含非 ASCII 字符的名称。由于此类字符会阻止 Amazon CloudWatch 记录数据,因此我们建议仅使用 ASCII 字符,这样您就可以跟踪 Step Functions 指标。

    2. 输入框中,输入以下 JSON 输入,运行您的工作流。

      { "who": "Amazon Step Functions" }
    3. 选择启动执行

    4. Step Functions 控制台会将您引导到一个以您的执行 ID 为标题的页面。该页面被称为执行详细信息页面。在此页面上,您可以随着执行的进展或者在执行完成后查看执行结果。

      要查看执行结果,请在图表视图上选择各个状态,然后在步骤详细信息窗格中选择各个选项卡,分别查看每个状态的详细信息,包括输入、输出和定义。有关可在执行详细信息页面上查看的执行信息的详细信息,请参阅执行详细信息概览

第 5 步:运行和停止工作线程

要让工作线程在您的状态机中轮询活动,必须运行工作线程。

  1. 在命令行上,导航到您在其中创建 GreeterActivities.java 的目录。

  2. 要使用 Amazon 开发工具包,请将 libthird-party 目录的完整路径添加到编译文件的依赖项以及您的 Java CLASSPATH 中。有关更多信息,请参阅《适用于 Java 的 Amazon SDK 开发人员指南》中的下载和解压缩开发工具包

  3. 编译文件。

    $ javac GreeterActivities.java
  4. 运行文件。

    $ java GreeterActivities
  5. Step Functions 控制台中,导航到执行详细信息页面。

  6. 执行完成后,检查执行结果。

  7. 停止工作线程。