我正在使用 Java Gmail API 来检索一些电子邮件。获得消息列表后,我将使用批处理来获取各个消息信息。
示例代码如下:
List<MessageDto> messages = new ArrayList<>();
String nextPageToken = null;
List<Message> batchMessages = new ArrayList<Message>();
ListMessagesResponse response =
gmailClient(googleId)
.users()
.messages()
.list(googleId)
.setQ(query)
.setPageToken(pageToken)
.setMaxResults(maxResults == null ? 50 : maxResults)
.execute();
if (response.getMessages() != null) {
batchMessages.addAll(response.getMessages());
nextPageToken = response.getNextPageToken();
final JsonBatchCallback<Message> callback =
new JsonBatchCallback<Message>() {
public void onSuccess(Message message, HttpHeaders responseHeaders) {
messages.add(MessageMapper.getMessage(googleId, message, false));
}
public void onFailure(GoogleJsonError e, HttpHeaders responseHeaders) {
log.error("Could not process message ", e);
}
};
BatchRequest batch = gmailClient(googleId).batch();
for (Message message : batchMessages) {
gmailClient(googleId)
.users()
.messages()
.get(googleId, message.getId())
.setFormat("raw")
.queue(batch, callback);
}
batch.execute();
}
我遇到的问题是,由于请求太多并陷入 onFailure 方法,因此并未检索到所有批处理消息。
我尝试在
HttpBackOffUnsuccessfulResponseHandler
上设置 HttpRequestInitializer
,但没有成功。
我在文档中偶然发现了这一点:https://cloud.google.com/java/docs/reference/google-api-client/latest/com.google.api.client.googleapis.batch
有一张纸条写着:
注意:通过调用设置 HttpUnsuccessfulResponseHandler 时 HttpRequest#setUnsuccessfulResponseHandler,调用该handler 每个不成功的部分。因此不建议使用 批量请求上的 HttpBackOffUnsuccessfulResponseHandler,因为 对于每个不成功的部分都会调用退避策略。
无论如何,我可以如何处理请求过多异常并重试请求?
任何帮助将不胜感激。
批处理不会为你节省任何东西,除了 http 调用,它仍然会花费与你的配额相同的费用。
当您发送一批 50 个请求时(这取决于 API 您可以批量发送多少个请求),所有这些请求都会同时到达服务器并运行。这意味着批处理可能会导致许多我认为您所看到的洪水类型错误。您不会总是得到它们,因为如果您登陆的服务器很忙,那么可能需要一些时间来处理您的请求。但是,如果您设法登陆不忙的服务器,它们可能会在创纪录的时间内运行,然后您会收到一条错误消息,指出您的洪水泛滥。
我通常给客户的建议是。
如果您确实收到错误,则很难知道在某些 api 上哪些错误已发送,哪些错误在批次中发生。您将需要配置一个系统来检查是否进行了更改,如果没有,则在下一批中发送。仅此一点就是我建议不要批处理的原因。