使用相同的 Quarkus 代码库处理 AWS HTTP 和 SQS 事件

voi*_*rld 7 aws-lambda quarkus

我已经使用 quarkus-amazon-lambda-http mvn 依赖项设置了 http quarkus 项目。它工作正常,但最重要的是我想为 SQS 事件添加自定义 lambda 处理程序。

我添加了 sqs lambda 处理程序

@Named("SqsHandler")
public class SqsHandlerLambda implements RequestHandler<InputObject, OutputObject> {

}
Run Code Online (Sandbox Code Playgroud)

并在 application.properties 中添加处理程序定义: quarkus.lambda.handler=SqsHandler

每当我尝试运行它时:mvn quarkus:dev它都会给出:

io.quarkus.builder.BuildException: Build failure: Multiple handler classes.  You have a custom handler class and the AWS Lambda HTTP extension.  Please remove one of them from your deployment
Run Code Online (Sandbox Code Playgroud)

我的想法是使用 SAM 模板中的环境变量来部署 2 个函数,其中一个函数处理 http 请求和其他 SQS 事件。但有可能实现我想要的吗?

Http 事件和 SQS 事件的代码库 80% 是相同的,因此如果我在两个单独的代码存储库中执行,将会出现大量重复代码。

std*_*bar 0

Lambda 提供了一个较低级别的处理程序,我个人认为它更容易处理:

public void handleRequest(InputStream inputStream,
                          OutputStream outputStream,
                          Context context) throws IOException
Run Code Online (Sandbox Code Playgroud)

这允许你做类似的事情:

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

....

@Named("lambdaHandler")
public class LambdaHandler implements RequestStreamHandler {

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

        LambdaLogger logger = context.getLogger();

        ObjectMapper objectMapper = new ObjectMapper();
        JsonNode rootNode = objectMapper.readTree(inputStream);

        logger.log("input is " + objectMapper.writeValueAsString(rootNode));

        // i'm totally guessing at the path
        String value = rootNode.path("request").path("email").asText();
Run Code Online (Sandbox Code Playgroud)

这将允许您接受任何输入。缺点是你需要进行一些反省才能InputStream确定你得到了什么。