AWS Lambda
开发人员指南

利用预定义接口创建处理程序 (Java)

您可以使用 AWS Lambda Java 核心库 (aws-lambda-java-core) 提供的预定义接口之一来创建 Lambda 函数处理程序,以作为使用任意名称和参数编写您自己的处理程序方法的替代方案。有关处理程序的更多信息,请参阅 Java 中的 AWS Lambda 函数处理程序

您可以实现预定义接口之一(RequestStreamHandlerRequestHandler)并为该接口提供的 handleRequest 方法提供实现。您可以根据使用标准 Java 类型还是自定义 POJO 类型作为处理程序的输入/输出(AWS Lambda 自动序列化和反序列化输入和输出,以匹配您的数据类型)来实现这些接口中的某一个,或使用 Stream 类型自定义序列化。

注意

aws-lambda-java-core 库中提供这些接口。

如果实现标准接口,它们可帮助您在编译时验证方法签名。

如果实现这些接口中的某一个,请在 Java 代码中指定 package.class 作为处理程序(创建 Lambda 函数时)。例如,下面是“入门”中修改过的 create-function CLI 命令。注意 --handler 参数指定了“example.Hello”值:

aws lambda create-function \ --region region \ --function-name getting-started-lambda-function-in-java \ --zip-file fileb://deployment-package (zip or jar) path \ --role arn:aws:iam::account-id:role/lambda_basic_execution \ --handler example.Hello \ --runtime java11 \ --timeout 15 \ --memory-size 512

下面几节提供实现这些接口的示例。

示例 1:创建带自定义 POJO 输入/输出的处理程序(利用 RequestHandler 接口)

本节中的示例 Hello 类实现 RequestHandler 接口。该接口定义 handleRequest() 方法,该方法接受事件数据作为 Request 类型的输入参数,返回 Response 类型的 POJO 对象:

public Response handleRequest(Request request, Context context) { ... }

下面显示了带有 handleRequest() 方法示例实现的 Hello 类。对于该示例,我们假定事件数据由名字和姓氏组成。

package example; import com.amazonaws.services.lambda.runtime.RequestHandler; import com.amazonaws.services.lambda.runtime.Context; public class Hello implements RequestHandler<Request, Response> { public Response handleRequest(Request request, Context context) { String greetingString = String.format("Hello %s %s.", request.firstName, request.lastName); return new Response(greetingString); } }

例如,如果 Request 对象中的事件数据为:

{ "firstName":"value1", "lastName" : "value2" }

则该方法返回下面的 Response 对象:

{ "greetings": "Hello value1 value2." }

接下来,您需要实现 RequestResponse 类。您可以使用下面的实现进行测试:

Request 类:

package example; public class Request { String firstName; String lastName; public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public Request(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } public Request() { } }

Response 类:

package example; public class Response { String greetings; public String getGreetings() { return greetings; } public void setGreetings(String greetings) { this.greetings = greetings; } public Response(String greetings) { this.greetings = greetings; } public Response() { } }

您可以按以下方式从该代码创建 Lambda 函数并测试端到端体验:

  • 使用上述代码创建部署程序包。有关更多信息,请参阅 Java 中的 AWS Lambda 部署程序包

  • 将部署程序包上传到 AWS Lambda 并创建 Lambda 函数。

  • 使用控制台或 CLI 测试 Lambda 函数。您可以指定符合 Request 类中 getter 和 setter 规范的任何示例 JSON 数据,例如:

    { "firstName":"John", "lastName" : "Doe" }

    Lambda 函数将在响应中返回下面的 JSON。

    { "greetings": "Hello John, Doe." }

按照“入门”(请参阅创建用 Java 编写的 Lambda 函数)中提供的说明进行操作。注意以下不同:

  • 创建部署程序包时,不要忘了 aws-lambda-java-core 库依赖项。

  • 在创建 Lambda 函数时,指定 example.Hello (package.class) 作为处理程序值。

示例 2:创建带流输入/输出的处理程序(利用 RequestStreamHandler 接口)

本示例中的 Hello 类实现 RequestStreamHandler 接口。该接口定义 handleRequest 方法,如下所示:

public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException { ... }

下面显示了带有 handleRequest() 处理程序示例实现的 Hello 类。该处理程序对传入的事件数据(例如:字符串“hello”)进行处理:简单地将其转换为大写字符串并返回。

package example; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import com.amazonaws.services.lambda.runtime.RequestStreamHandler; import com.amazonaws.services.lambda.runtime.Context; public class Hello implements RequestStreamHandler { public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException { int letter; while((letter = inputStream.read()) != -1) { outputStream.write(Character.toUpperCase(letter)); } } }

您可以按以下方式从该代码创建 Lambda 函数并测试端到端体验:

  • 使用之前的代码创建部署程序包。

  • 将部署程序包上传到 AWS Lambda 并创建 Lambda 函数。

  • 使用控制台或 CLI 测试 Lambda 函数。您可以指定任意示例字符串数据,例如:

    "test"

    Lambda 函数将在响应中返回 TEST

按照“入门”(请参阅创建用 Java 编写的 Lambda 函数)中提供的说明进行操作。注意以下不同:

  • 创建部署程序包时,不要忘了 aws-lambda-java-core 库依赖项。

  • 在创建 Lambda 函数时,指定 example.Hello (package.class) 作为处理程序值。