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

Java 使用Gmail API阅读大量电子邮件,java,email,google-api-java-client,gmail-api,Java,Email,Google Api Java Client,Gmail Api,我试图解析gmail账户中大量电子邮件的内容。我的代码在谷歌应用程序引擎上可以处理多达4000封电子邮件,但当数字更高时,我会出现以下错误 Uncaught exception from servlet com.google.apphosting.runtime.HardDeadlineExceededError 我的示例空间有大约4500封电子邮件,下面的代码需要一分钟多一点的时间才能收到所有电子邮件。我希望降低执行时间,以获取电子邮件 我的代码是: final List<Messag

我试图解析gmail账户中大量电子邮件的内容。我的代码在谷歌应用程序引擎上可以处理多达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();
}
final List messages=new ArrayList();
BatchRequest BatchRequest=gmail.batch();
JsonBatchCallback callback=新的JsonBatchCallback(){
成功时公共无效(消息、HttpHeaders和responseHeaders){
已同步(消息){
消息。添加(消息);
}
}
@凌驾
失败时公开作废(Google JSonerror e、HttpHeaders负责人)
抛出IOException{
}
};
int batchCount=0;
如果(NoofMails>0){
用于(消息:消息列表){
gmail.users().messages().get(“me”,message.getId()).set(“format”,“metadata”).set(“fields”,“payload”).queue(batchRequest,callback);
batchCount++;
如果(batchCount==1000){
试一试{
NoofMailsRead+=批次计数;
log.info(“读取的电子邮件数量:“+NoofMailsRead”);
batchRequest.execute();
}
捕获(例外e){
}
batchCount=0;
}
}
NoofMailsRead+=批次计数;
log.info(“读取的电子邮件数量:“+NoofMailsRead”);
batchRequest.execute();
}

您需要将工作分解为较小的任务,每个任务可以在30秒内完成

一个简单的谷歌搜索就会向您揭示这一点。

如前所述:RuntimeError

硬死线超差

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


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


Java具有帮助您完成此问题的功能。您可以使用。

超过死线的错误通常表示Google的服务器没有足够快地响应您的脚本。提高代码的性能不太可能有多大帮助,但即使有,当4500变为5500或6500时会发生什么?您可能需要采用不同的方法。