Lambda 任务 - Amazon SDK for Java
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

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

Lambda 任务

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

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

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

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

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

创建 Lambda 函数

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

注意

您使用什么语言来编写您的Lambda函数,它可以通过任何 Amazon SWF工作流,而不考虑工作流代码使用的语言。Amazon SWF处理运行函数和传入传出数据的详细信息。

这里是一个简单的Lambda函数,它可以用于代替构建简单Amazon SWF应用程序.

  • 此版本使用 JavaScript 编写,您可以使用 Amazon Web Services 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)中的Amazon 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 任务与调度活动相似。您提供决策与一个 “调度拉姆达函数”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 进行硬编码(包括 Amazon Web Services 账户 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-get 开发人员指南存储库。