【发布时间】: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