【问题标题】:Why my afterResponse method is not being called in my AWS lambda function?为什么我的 AWS lambda 函数中没有调用我的 afterResponse 方法?
【发布时间】:2017-01-01 06:02:36
【问题描述】:

我想在托管在 Amazon S3 和 CloudFront 上的静态网站上制作联系表格。我决定用 Java 为 AWS Lambda 编写简单的程序,并通过 AWS API Gateway 从我的静态网站调用它。

这是我的 LambdaHandler 类:

public class LambdaHandler extends RequestHandler2 {

    FormData formData = new FormData();

    public LambdaResponse handleRequest(FormData formData, Context context) {
        this.formData = formData;
        System.out.println(String.format("Hello %s.", formData.getName()));
        Map<String, String> headers = new HashMap<>();
        headers.put("Access-Control-Allow-Origin", "*");
        headers.put("Access-Control-Allow-Headers", "Content-Type");
        return new LambdaResponse(200, headers, "{}");
    }

    @Override
    public void afterResponse(Request<?> request, Response<?> response) {
        System.out.println("afterResponse");
        try {
            sendMail(formData.getName(), formData.getEmail(), formData.getCompany(), formData.getPhone(), formData.getSubject(), formData.getMessage());
        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }

}

问题是afterResponse 方法没有被调用。我需要在返回响应后发送一封电子邮件,因为发送电子邮件(通过 Amazon SES BTW)可能需要 13-18 秒(尤其是在一段时间未使用后调用 lambda 函数时)而且我没有希望用户等那么久。

在我的 AWS Lambda 配置中,我将 com.example.emailservice.LambdaHandler::handleRequest 作为处理程序。

【问题讨论】:

  • 我建议使用@override 注解来确保该方法确实被覆盖了。
  • 谢谢,但还是不行。
  • 你确定它没有失败吗?添加afterError
  • @teppic 谢谢,但afterError 也没有被调用。我添加了System.out.println("afterError");,但在Hello {name}(其中{name} 是请求中的参数)可见时,我在CloudWatch 中看不到该输出。

标签: java amazon-web-services aws-lambda


【解决方案1】:

您应该创建第二个 Lambda 函数,其唯一职责是调用 sendMail 函数。然后,您应该让当前的 LambdaHandler 将第二个 Lambda 函数作为“事件”调用(因此您不必等待它完成),然后再返回您的 LambdaResponse 实例。

【讨论】:

  • 真的有必要吗? afterResponse 是干什么用的?
猜你喜欢
  • 1970-01-01
  • 2015-03-17
  • 2015-08-01
  • 1970-01-01
  • 2014-03-15
  • 2020-03-30
  • 1970-01-01
  • 2019-09-17
相关资源
最近更新 更多