grpc with dataflow - java.lang.NoSuchMethodError

时间:2016-03-04 10:27:04

标签: google-cloud-dataflow grpc

我有一个使用maven protoc插件0.4.2和grpc版本0.8.0编译的grpc服务代码。我试图将此生成的代码与datafflow sdk 1.4.0一起使用,但是当我尝试使用阻塞存根创建一个grpc客户端时,我收到此错误。

com.google.cloud.dataflow.sdk.Pipeline$PipelineExecutionException: java.lang.NoSuchMethodError: io.grpc.protobuf.ProtoUtils.marshaller(Lcom/google/protobuf/MessageLite;)Lio/grpc/MethodDescriptor$Marshaller;
    at com.google.cloud.dataflow.sdk.Pipeline.run(Pipeline.java:186)

我不确定这是否是因为数据流sdk使用的protobuf版本与grpc生成的代码之间存在一些差异。 当我尝试从我的管道中的一个DoFn输出一个protobuf消息时,我也收到此错误

com.google.cloud.dataflow.sdk.Pipeline$PipelineExecutionException: java.lang.NoSuchMethodError: com.google.protobuf.GeneratedMessage.computeStringSize(ILjava/lang/Object;)I
    at com.google.cloud.dataflow.sdk.Pipeline.run(Pipeline.java:186)

我已经从maven中的数据流sdk依赖项中排除了protobuf,并且我的依赖树中显示的唯一protobuf和groc软件包分别是3.0.0-alpha-3.1和0.8.0。

2 个答案:

答案 0 :(得分:1)

在ppc-java 0.9.0中添加了

ProtoUtils.marshaller(MessageLite); grpc-java 0.8.0使用了Parser对象。尝试更新您的grpc-java版本。

与protobuf类似的问题。该方法在v3.0.0-alpha-4中添加。

答案 1 :(得分:0)

一个快速说明:PipelineExecutionException只是表示在执行管道时用户代码中发生了错误,因此它没有多大关系。您将要关注该失败的原因及其堆栈跟踪。

您的两个错误彼此略有不同,但每个错误都表明运行时使用的协议缓冲区库版本与生成协议缓冲区消息类的版本不匹配。