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

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

使用 Step Functions 创建活动状态机

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

要完成本教程,您需要:

  • 适用于 Java 的 开发工具包。本教程中的示例活动是一个 Java 应用程序,它使用与 Amazon SDK for Java 进行通信 Amazon。

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

第 1 步:创建活动

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

重要

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

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

  2. 选择创建活动

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

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

    arn:aws:states:us-east-1:123456789012:activity:get-greeting

第 2 步:创建状态机

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

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

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

  3. 选择模板对话框中,选择空白

  4. 选择选择。这将在设计模式中打开 Workflow Studio。

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

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

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

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

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

  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)环境变量。有关向工厂提供所需凭证的更多信息,请参阅AWSCredentialsProviderAmazon SDK for Java API 参考》和《Amazon SDK for Java 开发人员指南》中的 “设置 Amazon 证书和开发区域”。

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

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

第 4 步:运行状态机

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

  1. ActivityStateMachine页面上,选择开始执行

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

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

    1. (可选)要识别您的执行,您可以在名称框中为其指定一个名称。默认情况下,Step Functions 会自动生成一个唯一的执行名称。

      注意

      Step Functions 允许您为状态机、执行、活动、速率控制和包含非 ASCII 字符的标签创建名称。这些非 ASCII 名称不适用于亚马逊。 CloudWatch为确保您可以跟踪 CloudWatch 指标,请选择仅使用 ASCII 字符的名称。

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

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

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

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

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

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

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

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

  3. 编译文件。

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

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

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

  7. 停止工作线程。