0

环境:
使用 JSON API(com.google.api.services.storage.Storage 类)的 Java 客户端(“google-api-services-storage”、“v1-rev33-1.20.0”)。

目标:
使用 Java 客户端将大型对象从“标准”存储桶移动到“近线”存储桶(文件大小为 512 MB)。

步骤:
使用“重写” API 方法。

问题:
我在 20 秒内收到 SocketTimeoutException。

调查:
当我对同一对象使用从“标准”存储桶重写到另一个“标准”存储桶时,相同的代码工作正常。
我还尝试了APIs Explorer并创建了一个将对象从“标准”重写为“近线”存储桶的请求。服务器在大约 27 秒内做出响应,响应中的“totalBytesRewritten”属性大约是文件大小的一半。如何获取和处理此类响应?
文档说:
“如果源和目标是不同的位置和/或存储类,重写方法可能需要多次调用。”

我的代码(Java):

final Storage.Objects.Rewrite rewriteRequest = storage.objects().rewrite(
       STANDARD_BUCKET_NAME,
       SOURCE_OBJECT_PATH,
       NEARLINE_BUCKET_NAME,
       TARGET_OBJECT_PATH,
       null // no metadata overriding
);

rewriteRequest.execute();

请帮忙。

4

1 回答 1

0

根据文档,如果一个文件被分割成块,你应该再次调用 rewrite,使用 rewrite 的第一个响应中返回的'rewriteToken'。操作将恢复,再处理一大块数据。这应该重复,直到响应具有 getDone() == true。

我对 java api 的实现:

private void rewriteUntilDone(final String sourceBucket, final String sourceKey,
                              final String destBucket,  final String destKey) throws IOException {
    rewriteUntilDone(sourceBucket, sourceKey, destBucket, destKey, null);
}

private void rewriteUntilDone(final String sourceBucket, final String sourceKey,
                              final String destBucket, final String destKey,
                              @Nullable final String rewriteToken)
        throws IOException {

    Storage.Objects.Rewrite rewrite = googleStorage.objects().rewrite(sourceBucket, sourceKey, destBucket, destKey, null);
    if (rewriteToken != null) {
        rewrite.setRewriteToken(rewriteToken);
    }
    RewriteResponse rewriteResponse = rewrite.execute();

    if (!rewriteResponse.getDone()) {
        String rewriteToken2 = rewriteResponse.getRewriteToken();
        BigInteger totalBytesRewritten = rewriteResponse.getTotalBytesRewritten();
        log.debug("Rewriting not finished, bytes completed: {}. Calling rewrite again with token {}", totalBytesRewritten, rewriteToken2);
        rewriteUntilDone(sourceBucket, sourceKey, destBucket, destKey, rewriteToken2);
    }
}

编辑:另外,您可能必须增加读取超时。似乎 rewrite 在 27 秒后响应,但默认超时为 20 秒。包装您的 GoogleCredentials 以设置读取超时

于 2015-06-29T12:48:08.347 回答