2016-12-31 54 views
0

我想在我的静态网站上托管Amazon S3 & CloudFront上的联系表单。我决定使用Java为AWS Lambda编写简单的程序,并通过AWS API Gateway从我的静态网站调用它。为什么在我的AWS lambda函数中没有调用afterResponse方法?

这里是我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的处理程序。

+0

我建议使用@Override批注,以确保该方法真正被覆盖。 –

+0

谢谢,但仍然无法正常工作。 – Defozo

+1

你确定它没有失败吗?添加一个'afterError'。 – teppic

回答

0

您应该创建一个第二拉姆达函数,其唯一的责任是调用sendMail功能。然后,在返回LambdaResponse实例之前,您应该让当前的LambdaHandler调用第二个Lambda函数作为“事件”(这样您就不用等待它完成)。

+1

真的有必要吗? “afterResponse”是什么? – Defozo

相关问题