由于所有StreamObserver(CallStreamObserver,ServerCallStreamObserver)类都标记为实验性https://github.com/grpc/grpc-java/issues/1788,因此允许客户端通过发信号通知服务器停止发送消息来优雅地取消流服务的稳定方法是什么?

另外,如果我决定使用这些类来实现此功能,是否可以假设除非升级grpc-java版本,否则一切都会好吗?

最佳答案

您始终可以在存根返回的onError()上调用StreamObserver。对于存根未返回StreamObserver的服务器流式RPC,可以在Context内启动RPC。

CancellableContext withCancellation = Context.current().withCancellation();
Context prevCtx = withCancellation.attach();
try {
  stub.foo(request, responseObserver);
} finally {
  withCancellation.detach(prevCtx);
}

然后关闭Context将取消RPC:
withCancellation.close();

10-05 18:27