【问题标题】:gRPC onComplete for bidistream双向流的 gRPC onComplete
【发布时间】:2020-12-29 06:51:45
【问题描述】:

在我看到的所有 gRPC bidistream 示例中,都遵循一种模式,即当(入站)requestObserver 收到 onComplete 时,它会调用(出站)responseObserver 的 onComplete 方法。但是,onError 并没有这样做。

想知道如果我不调用 responseObserver.onComplete() 会发生什么会导致内存泄漏吗?为什么我们不为 onError 做呢?

public StreamObserver<Point> recordRoute(final StreamObserver<RouteSummary> responseObserver) {
  return new StreamObserver<Point>() {

    @Override
    public void onNext(Point point) {
      // does something here
    }

    @Override
    public void onError(Throwable t) {
      logger.log(Level.WARNING, "recordRoute cancelled");
    }

    @Override
    public void onCompleted() {
      responseObserver.onCompleted();
    }
  };
}

【问题讨论】:

    标签: grpc grpc-java


    【解决方案1】:

    想知道如果我不调用 responseObserver.onComplete() 会发生什么会导致内存泄漏吗?

    直到响应流也“完成”后,RPC 才完成/完成,所以是的,如果您最终不调用 responseObserver.onCompleted(),将会发生资源泄漏。在这个特定的示例中,恰好在请求流“完成”时响应流终止,但可能存在响应流仅在完成更多处理或在响应流上发送更多数据后才“完成”的情况.

    为什么我们不为 onError 做呢?

    onError() 是来自流的终止错误,这意味着调用已终止。不需要响应流上的 onError() 并且很可能不会做任何事情。

    【讨论】:

      猜你喜欢
      • 2019-04-08
      • 2020-09-30
      • 2018-08-30
      • 2021-12-01
      • 2021-03-29
      • 2018-04-26
      • 1970-01-01
      • 1970-01-01
      • 2022-11-03
      相关资源
      最近更新 更多