Lambda 任务 - 适用于 Java 的 AWS 软件开发工具包
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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

Lambda 任务

另一个方法是与 Amazon SWF 活动一起使用,就是使用 Lambda 函数代表工作流中的工作单元,并按照安排活动的相似方法安排它们。

本主题主要介绍如何使用Amazon SWF实施 AWS SDK for Java Lambda 任务。有关 Lambda 任务的更多概要性信息,请参阅 中的 AWS Lambda 任务Amazon SWF Developer Guide。

设置跨服务 IAM 角色以运行 Lambda 函数

在 Amazon SWF 能够运行您的 Lambda 函数前,需要设置一个 IAM 角色并授予 Amazon SWF 权限,让它代表您运行 Lambda 函数。有关如何完成该操作的完整信息,请参阅AWS Lambda 任务

在注册将使用 Amazon Resource Name 任务的工作流程时,将需要此 IAM 角色的 Lambda (ARN)。

创建 Lambda 函数

您可以使用包括 Java 在内的多种不同语言编写 Lambda 函数。有关如何编写、部署和使用 Lambda 函数的完整信息,请参阅 AWS Lambda 开发人员指南

注意

使用哪种语言编写 Lambda 函数并不重要,无论使用哪种语言编写工作流程代码,所有 Amazon SWF 工作流程都可以安排和运行您的函数。Amazon SWF 处理运行函数和传入传出数据的详细信息。

下面是一个简单的 Lambda 函数,它可以用于代替构建简单的 Amazon SWF 应用程序中的活动。

  • 该版本使用 JavaScript 编写,使用 AWS 管理控制台可以直接输入。

    exports.handler = function(event, context) { context.succeed("Hello, " + event.who + "!"); };
  • 以下是使用 Java 编写的相同函数,您同样可以在 Lambda 上部署和运行它:

    package example.swf.hellolambda; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; import com.amazonaws.util.json.JSONException; import com.amazonaws.util.json.JSONObject; public class SwfHelloLambdaFunction implements RequestHandler<Object, Object> { @Override public Object handleRequest(Object input, Context context) { String who = "Amazon SWF"; if (input != null) { JSONObject jso = null; try { jso = new JSONObject(input.toString()); who = jso.getString("who"); } catch (JSONException e) { e.printStackTrace(); } } return ("Hello, " + who + "!"); } }
    注意

    要了解有关将 Java 函数部署到 Lambda 的更多信息,请参阅 中的创建部署程序包 (Java)AWS Lambda Developer Guide。您可能还希望查看标题为使用 Java 编写 LAM 函数的编程模型的章节。

Lambda 函数使用 eventinput 对象作为第一个参数,使用 context 对象作为第二个参数,提供有关运行 Lambda 函数的请求的相关信息。该特定函数要求使用 JSON 提供输入,并将 who 字段设置为用于创建问候语的名称。

注册用于 Lambda 的工作流

对于预定 Lambda 函数的工作流,必须提供 IAM 角色的名称,由其为 Amazon SWF 提供调用 Lambda 函数的权限。您可以在工作流注册期间,使用 withDefaultLambdaRoleRegisterWorkflowTypeRequestsetDefaultLambdaRole 方法完成该设置。

System.out.println("** Registering the workflow type '" + WORKFLOW + "-" + WORKFLOW_VERSION + "'."); try { swf.registerWorkflowType(new RegisterWorkflowTypeRequest() .withDomain(DOMAIN) .withName(WORKFLOW) .withDefaultLambdaRole(lambda_role_arn) .withVersion(WORKFLOW_VERSION) .withDefaultChildPolicy(ChildPolicy.TERMINATE) .withDefaultTaskList(new TaskList().withName(TASKLIST)) .withDefaultTaskStartToCloseTimeout("30")); } catch (TypeAlreadyExistsException e) {

调度 Lambda 任务

调度 Lambda 任务与调度活动相似。使用 DecisionTypeScheduleLambdaFunctionScheduleLambdaFunctionDecisionAttributes 提供 Decision

running_functions == 0 && scheduled_functions == 0) { AWSLambda lam = AWSLambdaClientBuilder.defaultClient(); GetFunctionConfigurationResult function_config = lam.getFunctionConfiguration( new GetFunctionConfigurationRequest() .withFunctionName("HelloFunction")); String function_arn = function_config.getFunctionArn(); ScheduleLambdaFunctionDecisionAttributes attrs = new ScheduleLambdaFunctionDecisionAttributes() .withId("HelloFunction (Lambda task example)") .withName(function_arn) .withInput(workflow_input); decisions.add(

在 中ScheduleLambdaFuntionDecisionAttributes,您必须提供一个名称(这是要调用的Lambda函数的 ARN)和一个 ID(将用于在历史记录日志中Amazon SWF标识Lambda函数的名称)。

您还可以为函数提供可选的输入Lambda,并将其开始设置为关闭超时值,这是Lambda函数在生成LambdaFunctionTimedOut事件之前允许运行的秒数。

注意

在给出函数名称后,该代码使用 AWSLambdaClient 检索 Lambda 函数的 ARN。您可以使用该方法,以避免您的代码中包含完整 ARN 的硬编码 (包括 AWS 账户 ID)。

在决策程序中处理 Lambda 函数事件

Lambda 任务会使用 LambdaEventType 值 (如 LambdaFunctionScheduledLambdaFunctionStarted) 生成与 LambdaFunctionCompleted 任务生命周期对应的多个事件,在工作流工作线程中轮询决策任务时可以对这些事件执行操作。如果 Lambda 函数失败或运行时间超出其超时值,您会分别收到 LambdaFunctionFailedLambdaFunctionTimedOut 事件类型。

boolean function_completed = false; String result = null; System.out.println("Executing the decision task for the history events: ["); for (HistoryEvent event : events) { System.out.println(" " + event); EventType event_type = EventType.fromValue(event.getEventType()); switch(event_type) { case WorkflowExecutionStarted: workflow_input = event.getWorkflowExecutionStartedEventAttributes() .getInput(); break; case LambdaFunctionScheduled: scheduled_functions++; break; case ScheduleLambdaFunctionFailed: scheduled_functions--; break; case LambdaFunctionStarted: scheduled_functions--; running_functions++; break; case LambdaFunctionCompleted: running_functions--; function_completed = true; result = event.getLambdaFunctionCompletedEventAttributes() .getResult(); break; case LambdaFunctionFailed: running_functions--; break; case LambdaFunctionTimedOut: running_functions--; break;

从您的 Lambda 函数接收输出

当您收到 LambdaFunctionCompleted EventType 时,您可以通过以下方式检索Lambda函数的返回值:先getLambdaFunctionCompletedEventAttributesHistoryEvent 调用 以获取 LambdaFunctionCompletedEventAttributes对象,然后调用其 getResult 方法来检索Lambda函数的输出:

LambdaFunctionCompleted: running_functions--;

此示例的完整源代码

您可以浏览 awsdocs/aws-java-developer-guide/tree/master/doc_source/snippets/helloswf_lambda/ 以获取 aws-java-developer-guide 存储库中 Github 上的此示例。