AWS Step Functions
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

创建活动状态机

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

要完成本教程,您需要:

  • 适用于 Java 的开发工具包。本教程中的示例活动是 Java 应用程序,该应用程序使用 AWS SDK for Java 与 AWS 通信。

  • 环境中或标准 AWS 配置文件中的 AWS 凭证。有关更多信息,请参阅AWS SDK for Java Developer Guide 中的设置 AWS 凭证

步骤 1:创建新活动

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

重要

确保您的活动任务与状态机位于同一 AWS 账户下。

  1. Step Functions 控制台中,选择左侧导航面板中的 Activities (活动)

  2. 选择 Create activity (创建活动)。

  3. 输入 Activity Name (活动名称),例如 get-greeting,然后选择 Create Activity (创建活动)

  4. 当您的活动任务创建完成后,请记下其 Amazon 资源名称 (ARN),例如:

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

步骤 2:创建状态机

创建一个状态机,该状态机确定什么时候调用活动以及什么时候工作线程执行其主要工作,收集其结果并返回这些结果。

  1. Step Functions 控制台中,选择左侧导航面板中的 State machines (状态机)

  2. State machines (状态机) 页面上,选择 Create state machine (创建状态机)Author with code snippets (使用代码段创作),然后在 Details (详细信息) 下输入名称(例如 ActivityStateMachine)

    注意

    状态机名称、执行名称和活动名称的长度必须是 1–80 个字符,在您的账户和 AWS 区域中必须是唯一的,并且不得包含以下任何内容:

    • 空格

    • 通配符 (? *)

    • 括号字符 (< > { } [ ])

    • 特殊字符 (: ; , \ | ^ ~ $ # % & ` ")

    • 控制字符 (\\u0000 - \\u001f\\u007f - \\u009f)。

    Step Functions 允许您创建包含非 ASCII 字符的状态机、执行和活动名称。这些非 ASCII 名称不适用于 Amazon CloudWatch。为确保您可以跟踪 CloudWatch 指标,请选择一个只使用 ASCII 字符的名称。

    State machine definition (状态机定义) 下,输入以下代码并将您之前创建的活动任务的 ARN 包含到 Resource 字段中。例如:

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

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

  3. 使用 Visual Workflow 窗格中的图表检查您的 Amazon 状态语言 代码是否正确描述了状态机。

    如果您未看到该图表,请在 Visual Workflow 窗格中选择“ 
       refresh
    ”。

  4. 选择 Next (下一步)

  5. 创建或输入 IAM 角色:

    • 要为 Step Functions 创建 IAM 角色,请选择为我创建 IAM 角色,然后输入角色的名称

    • 如果您使用您的状态机的正确权限之前已创建 IAM 角色,请选择 Choose an existing IAM role (选择现有 IAM 角色)。从列表中选择一个角色,或者提供该角色的 ARN。

    注意

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

  6. 选择 Create state machine (创建状态机)

步骤 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)环境变量。有关向工厂提供所需凭证的更多信息,请参阅AWS SDK for Java API Reference 中的 AWSCredentialsProviderAWS SDK for Java Developer Guide 中的设置用于开发的 AWS 凭证和区域

    为了让 Step Functions 有足够的时间来处理请求,请将 setSocketTimeout 设置为 70 秒。

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

步骤 4:开始执行

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

  1. ActivityStateMachine 页面上,选择 Start execution (开始执行)。

    此时将显示 New execution 页面。

  2. (可选) 为帮助您标识执行,您可以在 Enter an execution name 框中为执行指定一个 ID。如果未输入 ID,Step Functions 将自动生成一个唯一 ID。

    注意

    Step Functions 允许您创建包含非 ASCII 字符的状态机、执行和活动名称。这些非 ASCII 名称不适用于 Amazon CloudWatch。为确保您可以跟踪 CloudWatch 指标,请选择一个只使用 ASCII 字符的名称。

  3. 在执行输入区域中,将示例数据替换为以下内容。

    { "who" : "AWS Step Functions" }
  4. 选择 Start Execution (开始执行)

    此时将启动新的状态机执行,并显示一个说明正在运行的执行的新页面。

  5. Execution Details 部分中,选择 Info 以查看 Execution Status 以及 StartedClosed 时间戳。

  6. 要查看工作流程的输出,请在 Execution Details (执行详细信息) 部分展开 Output (输出) 部分。

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

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

执行完成后,您应停止工作线程。如果您不停止工作线程,它将继续运行并轮询活动。执行停止后,工作线程没有任务来源,将在每次轮询中生成一个 SocketTimeoutException

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

  2. 要使用 AWS 开发工具包,请将 libthird-party 目录的完整路径添加到编译文件的依赖项以及您的 Java CLASSPATH 中。有关更多信息,请参阅 AWS SDK for Java Developer Guide 中的下载并提取开发工具包

  3. 编译文件。

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

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

  6. 执行完成后,选择 Output 以查看执行的结果。

  7. 停止工作线程。