我正在运行一项服务,该服务可以在GCP存储桶中创建或更新对象。即我的代码检查对象是否存在,如果是,我的代码读取它,更新它并将其写回。 我偶尔会在尝试读取对象时遇到异常。 我的代码:
Storage storage = googleStorage.get();
BlobId blobId = BlobId.of(STORAGE_BUCKET, "path/to.obj"));
Blob blob = storage.get(blobId);
if (blob == null) return null;
byte[] blobContent = blob.getContent();
...
stacktrace:
...
at com.google.cloud.storage.Blob.getContent(Blob.java:455)
at com.google.cloud.storage.StorageImpl.readAllBytes(StorageImpl.java:461)
at com.google.cloud.RetryHelper.runWithRetries(RetryHelper.java:51)
at com.google.cloud.RetryHelper.run(RetryHelper.java:74)
at com.google.api.gax.retrying.DirectRetryingExecutor.submit(DirectRetryingExecutor.java:89)
at com.google.cloud.storage.StorageImpl$16.call(StorageImpl.java:461)
at com.google.cloud.storage.StorageImpl$16.call(StorageImpl.java:464)
at com.google.cloud.storage.spi.v1.HttpStorageRpc.load(HttpStorageRpc.java:588)
at com.google.cloud.storage.spi.v1.HttpStorageRpc.translate(HttpStorageRpc.java:220)
No such object: bucket/path/to.obj
com.google.cloud.storage.StorageException: 404 Not Found
如果对象不存在,我希望在blob
中变为空,或者如果blob
不为空,我希望能够读取。
此行为导致对象被多次更新(不确定这是因为我的代码重试了调用还是因为存储库正在执行某些操作)。
我使用谷歌云存储1.27.0,它每约10K对象发生一次。
答案 0 :(得分:0)
您不需要BlobId
。您可以使用此方法:
Blob blob = storage.get(bucketName).get(pathToObject);
如果blob在指定路径中不存在,则此方法将返回null
。
答案 1 :(得分:0)
我已经测试了您提供的代码并且它似乎以所需的方式工作 - 如果无法找到云存储对象或路径不正确,则Blob对象被指定为null。
失败的发生率非常低。也许如果使用RetryParams类配置指数退避,则可以消除或减少这些故障的影响。