1

我有一个使用 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。

4

2 回答 2

1

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

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

于 2016-03-07T19:21:16.683 回答
0

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

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

于 2016-03-07T04:57:27.347 回答