2015-03-31 125 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

相关问题