Gmail Javi API 批量请求过多

问题描述 投票:0回答:1

我正在使用 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,因为 对于每个不成功的部分都会调用退避策略。

无论如何,我可以如何处理请求过多异常并重试请求?

任何帮助将不胜感激。

java gmail-api google-api-java-client
1个回答
0
投票

批处理不会为你节省任何东西,除了 http 调用,它仍然会花费与你的配额相同的费用。

当您发送一批 50 个请求时(这取决于 API 您可以批量发送多少个请求),所有这些请求都会同时到达服务器并运行。这意味着批处理可能会导致许多我认为您所看到的洪水类型错误。您不会总是得到它们,因为如果您登陆的服务器很忙,那么可能需要一些时间来处理您的请求。但是,如果您设法登陆不忙的服务器,它们可能会在创纪录的时间内运行,然后您会收到一条错误消息,指出您的洪水泛滥。

我通常给客户的建议是。

  1. 不要打扰批处理。
  2. 如果你确实必须批量保持数字较低,请尝试 10 如果仍然出现错误,请尝试

如果您确实收到错误,则很难知道在某些 api 上哪些错误已发送,哪些错误在批次中发生。您将需要配置一个系统来检查是否进行了更改,如果没有,则在下一批中发送。仅此一点就是我建议不要批处理的原因。

© www.soinside.com 2019 - 2024. All rights reserved.