bidistream 的 gRPC onComplete
gRPC onComplete for bidistream
在我见过的所有 gRPC bidistream 示例中,当(入站)requestObserver 收到 onComplete 时,它会调用 onComplete (出站)responseObserver 的方法。然而,这不是为 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();
}
};
}
Wondering what happens if I don't invoke responseObserver.onComplete() does it lead to memory leak?
在响应流也“完成”之前,RPC 不是 complete/done,所以是的,如果您最终不调用 responseObserver.onCompleted()
,将会发生资源泄漏。在此特定示例中,恰好响应流在请求流“完成”时终止,但可能存在响应流仅在完成更多处理或在响应流上发送更多数据后才“完成”的情况.
Why we don't do it for onError?
onError() 是来自流的终止错误,这意味着调用已终止。不需要响应流上的 onError() 并且很可能不会做任何事情。
在我见过的所有 gRPC bidistream 示例中,当(入站)requestObserver 收到 onComplete 时,它会调用 onComplete (出站)responseObserver 的方法。然而,这不是为 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();
}
};
}
Wondering what happens if I don't invoke responseObserver.onComplete() does it lead to memory leak?
在响应流也“完成”之前,RPC 不是 complete/done,所以是的,如果您最终不调用 responseObserver.onCompleted()
,将会发生资源泄漏。在此特定示例中,恰好响应流在请求流“完成”时终止,但可能存在响应流仅在完成更多处理或在响应流上发送更多数据后才“完成”的情况.
Why we don't do it for onError?
onError() 是来自流的终止错误,这意味着调用已终止。不需要响应流上的 onError() 并且很可能不会做任何事情。