首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Google -将一个大对象重写为“近线”桶时的SocketTimeoutException

Google -将一个大对象重写为“近线”桶时的SocketTimeoutException
EN

Stack Overflow用户
提问于 2015-05-12 10:23:49
回答 1查看 1.5K关注 0票数 0

环境:

使用JSON (com.google.api.services.storage.Storage类)的Java (“google服务-存储”、"v1-rev33-1.20.0")。

目标:

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

步骤:

使用“重写” API方法。

问题:

我20秒后就能拿到SocketTimeoutException了。

Investigation:

当我对同一个对象使用从“标准”桶到另一个“标准”桶的重写时,相同的代码工作得很好。

我还尝试了API资源管理器,并创建了一个请求,将对象从“标准”重写为“近线”桶。服务器响应时间约为27秒,响应中的"totalBytesRewritten“属性约为文件大小的一半。如何获得和处理这种反应?

文件上说:

“如果源和目标是不同的位置和/或存储类,重写方法可能需要多次调用。”

我的代码(Java):

代码语言:javascript
复制
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();

请帮帮忙。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-29 12:48:08

根据文档,如果一个文件被分割成块,那么您应该再次调用重写,使用在重写后的第一个响应中返回的'rewriteToken‘。操作将继续进行,再执行一段数据。应该重复这种情况,直到响应具有getDone() == true为止。

我对java api的实现:

代码语言:javascript
复制
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);
    }
}

编辑:此外,您可能必须增加读取超时。看起来重写在27秒后才会响应,但是默认的超时时间是20 s. 包装GoogleCredentials以设置读取超时

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30188056

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档