【问题标题】:grpc with dataflow - java.lang.NoSuchMethodError带有数据流的 grpc - java.lang.NoSuchMethodError
【发布时间】:2016-03-04 10:27:04
【问题描述】:

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

【问题讨论】:

    标签: google-cloud-dataflow grpc


    【解决方案1】:

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

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

    【讨论】:

    • 仅供参考,此 ProtoUtils.marshaller 已移至 ProtoLiteUtils 发布 0.14
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-28
      • 2010-10-25
      • 1970-01-01
      • 2019-03-10
      • 2018-06-22
      • 2022-01-22
      • 1970-01-01
      相关资源
      最近更新 更多