Lambda 任务 - AWS SDK for Java1.x

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

Lambda 任务

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

本主题主要介绍如何实施Amazon SWF Lambda使用任务AWS SDK for Java. 有关 的更多信息Lambda一般情况下,请参阅AWS Lambda任务中的Amazon SWF开发人员指南 的第一个版本。

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

优化前Amazon SWF可以运行你的Lambda函数,您需要设置 IAM 角色来授予Amazon SWF运行权限Lambda代表您执行函数。有关如何执行此操作的完整信息,请参阅AWS Lambda任务.

在注册将使用此 IAM 角色的 Amazon 资源名称 (ARN) 时,您将需要此 IAM 角色的 Amazon 资源名称 (ARN)。Lambda任务。

创建 Lambda 函数

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

注意

您用什么语言编写您的无关紧要Lambda函数,它可以安排和运行任何 Amazon SWF无论您的工作流程代码使用何种语言编写。Amazon SWF处理运行函数和传入传出数据的详细信息。

以下是一个简单的Lambda可以用来代替中的活动的函数构建简单Amazon SWF应用程序.

  • 此版本使用 JavaScript 编写,您可以使用直接输入AWS Management Console

    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 = "{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开发人员指南 的第一个版本。您还希望查看标题为的章节用于编写的编程模型LambdaJava 中的函数.

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 任务与调度活动相似。您提供决策带有 “调度 LambDAW 函数”DecisionType还有ScheduleLambdaFunctionDecisionAttributes.

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 中,必须提供 name,这是要调用的 Lambda 函数的 ARN;还必须提供 id,这是用于在历史记录日志中标识 Lambda 函数的 Amazon SWF 的名称。

还可以为 函数提供可选的 inputLambda 并设置它的 start to close timeout 值,这是在生成 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, you can retrieve your –0— function’s return value by first calling `getLambdaFunctionCompletedEventAttributesHistoryEvent要获取LambdaFunctionCompletedEventAttributes对象,然后调用它getResult方法来检索Lambda函数:

LambdaFunctionCompleted: running_functions--;

此示例的完整源代码

您可以浏览完整来源:github: `<awsdocs/aws-java-developer-guide/tree/master/doc_source/snippets/helloswf_lambda/>对于在 Github 上的这个例子aws-java-开发人员指南存储库。