在Google云端硬盘文档上创建多个权限时出现Java异常

时间:2017-03-23 09:31:38

标签: java google-app-engine google-api google-drive-api

在我们的应用程序中,我们需要使用Google Drive api向多个用户共享多个文件。

我们使用Google Drive api的java客户端库提供的批处理。

这已经在制作中运行,但我们从Google Drive api中获得了许多不明确的例外情况:

Internal Error. User message: "An internal error has occurred which prevented the sharing of these item(s): "

enter image description here

我们处理异常并以指数退避重试,但这些错误会导致此应用程序的流量和可用性出现大的延迟。

这些例外发生的原因是什么?如何避免这些?

如果我们知道出现这些异常时会出现什么问题,那将非常有用,所以我们可以避免它。

一些额外信息: 每个批处理对不同文件包含100个权限操作。 每分钟调用一次批处理操作。

代码:

String fileId = "1sTWaJ_j7PkjzaBWtNc3IzovK5hQf21FbOw9yLeeLPNQ";
JsonBatchCallback<Permission> callback = new JsonBatchCallback<Permission>() 
{
    @Override
    public void onFailure(GoogleJsonError e, HttpHeaders responseHeaders)
        throws IOException {
        System.err.println(e.getMessage());
    }

    @Override
    public void onSuccess(Permission permission, HttpHeaders responseHeaders) throws IOException {
        System.out.println("Permission ID: " + permission.getId());
    }
};

BatchRequest batch = driveService.batch();

for(String email : emails) {
    Permission userPermission = new Permission().setType("user").setRole("reader").setEmailAddress(email);
    driveService.permissions().create(fileId, userPermission).setSendNotificationEmail(false).setFields("id").queue(batch, callback);
}

batch.execute();

变量电子邮件包含100个电子邮件字符串。

1 个答案:

答案 0 :(得分:1)

    {
    "code" : 500,
    "errors" : [ {
    "domain" : "global",
    "message" : "Internal Error. User message: "An internal                                                     error has occurred which prevented the sharing of these item(s): fileame"",
   "reason" : "internalError"
    } ],
  "message" : "Internal Error. User message: "An internal error has occurred which prevented the sharing of these item(s): filename""
    }

基本上是防洪。通常的建议是Implementing exponential backoff

  

指数退避是网络的标准错误处理策略   客户端定期重试失败请求的应用程序   越来越多的时间。如果请求量很大或者   繁重的网络流量导致服务器返回错误,指数级   退避可能是处理这些错误的好策略。反过来,   它不是处理与之无关的错误的相关策略   限速,网络容量或响应时间,如无效   授权凭证或文件未找到错误。

     

使用得当,指数退避可以提高效率   带宽使用,减少了获得所需的请求数量   成功响应,并最大化请求的吞吐量   并发环境。

现在这是你要说的但是我正在批处理我不能这样做。 Yup配料属于同样的防洪保护。您的批次充斥着服务器。是的,我知道它说你可以发送100个请求,如果请求在每个请求之间花费足够的时间不符合洪水的要求,你可能可以,但是你的请求显然没有。

我的建议是你尝试将其减去10个请求,然后慢慢踩它。使用批量配额使用时,您不能自行保存任何内容,就像您没有批量配置一样。你不能比洪水保护允许的更快。