我正在使用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方法,并非所有批处理消息都被检索到.

我try 在HttpRequestInitializer上设置HttpBackOffUnsuccessfulResponseHandler,但没有起作用.

我在文档中偶然发现了这一点:https://cloud.google.com/java/docs/reference/google-api-client/latest/com.google.api.client.googleapis.batch

有一张纸条写着:

注意:当通过调用设置httpUnsuccessfulResponseTimeout时 httpResource #setUnsuccessfulResponseDeliverable,调用处理程序 每个不成功的部分.因此不建议使用 批量请求上的httpBackOffUnsuccessfulResponseDeliverable,因为 for each 不成功的部分调用回退策略.

我有没有办法处理太多请求异常并重新try 请求?

任何帮助都将不胜感激.

推荐答案

除了http调用之外,收件箱不会为您节省任何费用,它的费用仍然与您的配额相同.

当您发送一批例如50个请求时(这取决于API,您可以批量发送多少个请求),所有这些请求都会同时到达服务器并运行. 这意味着收件箱可能会导致许多洪泛类型错误,我想您已经看到了这一点. 您不会总是收到它们,因为如果您访问的服务器繁忙,那么可能需要时间来处理您的请求.然而,如果您设法登陆不繁忙的服务器,它们都可能在创纪录的时间内运行,然后您会收到一个错误,称您已发生洪水.

我通常给客户的建议是.

  1. 别打扰了.
  2. 如果您确实必须批量保持较低数字,如果仍然出现错误,请try 10

如果您确实遇到错误,很难知道哪些错误已发送,哪些错误在某些api上的批处理中出错.您需要配置系统来判断是否进行了更改,如果没有,则在下一批中发送. 仅此一点就是我建议不要卸载的原因.

Java相关问答推荐

Gmail Javi API批量处理太多请求

Java中不同包中的类之间的配置共享

Apache POI:使用反射获取zoom 级别

如何配置ActiveMQ Artemis以使用AMQP 1.0和其他协议与Java

Java编译器抛出可能未正确初始化的错误?

试着做一个2x2的魔方求解算法,我如何找到解路径(DFS)?

GSON期间的Java类型擦除

解释左移在Java中的工作原理

多重延迟签名

将PNG转换为位图自定义十六进制字符串

使用htmlunit和java单击按钮

AWS Java SDK v2.x中没有setObjectAcl方法

在一行中检索字符分隔字符串的第n个值

使用迭代器遍历HashMap不会因IF条件而停止

在打开搜索结果时,如何让Eclipse打开整个文件?

处理4.3问题:javax.xml.ind包不存在(&Q;).您可能在学习GitHub教程时遗漏了库.&Q

将@Transactional添加到Spring框架中链下的每个方法会产生什么效果?

JavaFX中ListView中的问题

ExecutorService:如果我向Executor提交了太多任务,会发生什么?

如何在Java上为循环数组从synchronized迁移到ReentrantLock