2016-12-31 53 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

相關問題