用于双向流的 gRPC onComplete

时间:2020-12-29 06:51:45

标签: grpc grpc-java

在我看到的所有 gRPC 双向流示例中,当(入站)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();
    }
  };
}

1 个答案:

答案 0 :(得分:1)

<块引用>

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

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

<块引用>

为什么我们不对 onError 这样做?

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