1

我有时会在put()上得到以下异常。 (虽然一般情况下,我的代码工作正常。)我们如何防止Google Cloud API吞噬异常?

我最好的猜测是数据存储内部遇到索引错误(其中有no tools for diagnosing),但我不确定,因为错误吞噬Protobuf解析问题。

In another case,与Protobuf解析消息类似的吞吐异常,是由Dataflow自己的Datastore API内部的一个bug造成的,Dataflow团队修复了这个问题 - 但这里我根本没有使用Dataflow。

我怎样才能知道是什么造成了这种情况?

使用Google Cloud API 0.28。

... at com.google.cloud.datastore.DatastoreImpl.put(DatastoreImpl.java:340) 
    at com.google.cloud.datastore.DatastoreImpl.commitMutation(DatastoreImpl.java:380) 
    at com.google.cloud.datastore.DatastoreImpl.commit(DatastoreImpl.java:386) 
    at com.google.cloud.RetryHelper.runWithRetries(RetryHelper.java:244) 
    at com.google.cloud.RetryHelper.doRetry(RetryHelper.java:179) 
    at com.google.cloud.datastore.DatastoreImpl$4.call(DatastoreImpl.java:387) 
    at com.google.cloud.datastore.DatastoreImpl$4.call(DatastoreImpl.java:390) 
    at com.google.cloud.datastore.spi.DefaultDatastoreRpc.commit(DefaultDatastoreRpc.java:131) 
    at com.google.datastore.v1.client.Datastore.commit(Datastore.java:84) 
    at com.google.datastore.v1.client.RemoteRpc.call(RemoteRpc.java:89) 
    at com.google.datastore.v1.client.RemoteRpc.makeException(RemoteRpc.java:148) 
    at com.google.rpc.Status.parseFrom(Status.java:323) 
    java.lang.NoSuchMethodError: com.google.protobuf.GeneratedMessage.parseWithIOException(Lcom/google/protobuf/Parser;Ljava/io/InputStream;)Lcom/google/protobuf/Message; 

回答

2

我觉得这是一个旧版本的com.google.protobuf:protobuf-java神器使得它在你的classpath的症状。在com.google.protobuf:protobuf-java:jar:3.0.0中增加了GeneratedMessage.parseWithIOException方法。

用于防止

一种方法是增加一个dependencyManagement部分,将POM文件:

<dependencyManagement> 
    <dependencies> 
    <dependency> 
     <groupId>com.google.protobuf</groupId> 
     <artifactId>protobuf-java</artifactId> 
     <version>3.0.0</version> 
    </dependency> 
    </dependencies> 
</dependencyManagement> 

一旦依赖问题得到清理,客户应该能够正确地分析Status PROTOS并显示潜在的错误。

+0

谢谢。这个伎俩。例外确实是“索引条目对于实体来说太大”的例外 –