使用Gmail API阅读大量电子邮件

时间:2015-03-31 02:35:52

标签: java email google-api-java-client gmail-api

我正在尝试解析Gmail帐户中的大量电子邮件的内容。我的代码可以在Google App Engine上运行最多约4000封电子邮件,但是当数字更高时我收到以下错误

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();
}

2 个答案:

答案 0 :(得分:1)

如上所述here:RuntimeError

  

HardDeadlineExceededError

是因为你必须在30秒内完成任务。


要在大约30秒内完成整个任务,您可以使用Divide and Conquer Algorithms。这种技术使用处理器的所有并行功能将任务分解为更小的任务。要确定最佳任务数量,可能会有点困难因为取决于您的操作系统,处理器......您必须做一些测试和基准测试。

Java有java.util.concurrent可以帮助您完成此问题。您可以使用Fork/Join Framework

答案 1 :(得分:0)

你需要将工作分解成可以在30秒内完成的小任务。

简单的谷歌搜索会向您透露这一点。