环境:
使用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):
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();请帮帮忙。
发布于 2015-06-29 12:48:08
根据文档,如果一个文件被分割成块,那么您应该再次调用重写,使用在重写后的第一个响应中返回的'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);
}
}编辑:此外,您可能必须增加读取超时。看起来重写在27秒后才会响应,但是默认的超时时间是20 s. 包装GoogleCredentials以设置读取超时。
https://stackoverflow.com/questions/30188056
复制相似问题