【发布时间】:2015-06-04 06:17:03
【问题描述】:
我正在尝试解析 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();
}
【问题讨论】:
-
DeadlineExceeded 错误通常表明 Google 的服务器没有足够快地响应您的脚本。提高代码的性能不太可能有太大帮助,但即使有,当 4500 变为 5500 或 6500 时会发生什么?您可能需要采用不同的方法。
标签: java email google-api-java-client gmail-api