2015-03-31 46 views
1

我正試圖解析gmail帳戶中大量電子郵件的內容。我的代碼工作正常,在谷歌應用程序引擎高達〜4000級的郵件,但我得到以下錯誤,當數越高使用Gmail API閱讀大量電子郵件

Uncaught exception from servlet com.google.apphosting.runtime.HardDeadlineExceededError 

我的樣本空間有大約4500電子郵件和下面的代碼將採取多一點分鐘得到所有的電子郵件。我期待降低執行時間以獲取電子郵件。

我的代碼是:

final List<Message> messages = new ArrayList<Message>(); 
BatchRequest batchRequest = gmail.batch(); 

JsonBatchCallback<Message> callback = new JsonBatchCallback<Message>() { 
    public void onSuccess(Message message, HttpHeaders responseHeaders) { 
     synchronized (messages) { 
      messages.add(message); 
     } 
    } 

    @Override 
    public void onFailure(GoogleJsonError e, HttpHeaders responseHeaders) 
      throws IOException { 
    } 
}; 

int batchCount=0; 
if(noOfEmails>0){ 
    for(Message message : messageList){ 
     gmail.users().messages().get("me", message.getId()).set("format", "metadata").set("fields", "payload").queue(batchRequest, callback); 
     batchCount++; 
     if(batchCount==1000){ 
      try{ 
       noOfEmailsRead+=batchCount; 
       log.info("No of Emails Read : " + noOfEmailsRead); 
       batchRequest.execute(); 
      } 
      catch(Exception e){ 

      } 
      batchCount=0; 
     } 
    } 
    noOfEmailsRead+=batchCount; 
    log.info("No of Emails Read : " + noOfEmailsRead); 
    batchRequest.execute(); 
} 
+1

DeadlineExceeded錯誤通常表示Google的服務器沒有足夠快地響應您的腳本。提高代碼的性能不太可能有幫助,但即使這樣做,當4500變爲5500或6500時會發生什麼?您可能需要採用不同的方法。 – 2015-03-31 02:41:01

回答

0

你需要將工作分解成更小的任務可以完成每一個在30秒內。

一個簡單的谷歌搜索會顯示給你。

1

至於說here:RuntimeError

HardDeadlineExceededError

是因爲你必須在30秒內完成你的任務。


要在大約30秒內完成整個任務,您可以使用Divide and Conquer Algorithms。這項技術將任務分解爲更小的任務,並利用處理器的所有並行功能。要確定最佳的任務數量,可能有點困難,因爲取決於您的操作系統,處理器,....您必須執行一些測試和基準測試。

Java的java.util.concurrent可以幫助您完成此問題。您可以使用Fork/Join Framework

相關問題