Java 使用Gmail API阅读大量电子邮件
我试图解析gmail账户中大量电子邮件的内容。我的代码在谷歌应用程序引擎上可以处理多达4000封电子邮件,但当数字更高时,我会出现以下错误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
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时会发生什么?您可能需要采用不同的方法。