在我看到的所有 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();
}
};
}
答案 0 :(得分:1)
想知道如果我不调用 responseObserver.onComplete() 会导致内存泄漏吗?
在响应流也“完成”之前,RPC 不会完成/完成,所以是的,如果您最终不调用 responseObserver.onComplete()
,将会出现资源泄漏。在这个特定的例子中,当请求流“完成”时,响应流恰好终止,但可能存在响应流仅在完成更多处理或在响应流上发送更多数据后“完成”的情况.
为什么我们不对 onError 这样做?
onError() 是来自流的终止错误,这意味着调用已终止。不需要响应流上的 onError() 并且很可能不会做任何事情。