如何取消 GRPC 流式调用?

How to cancel a GRPC streaming call?

通常,客户端可以通过以下方式取消 gRPC 调用:

(requestObserver as ClientCallStreamObserver<Request>)
    .cancel("Cancelled", null)

但是,显示在Javadoc:

CancellableContext withCancellation = Context.current().withCancellation();
// do stuff
withCancellation.cancel(t);

取消客户端调用并让服务器知道的“正确”方法是什么?

编辑:

为了让事情更混乱,还有 ManagedChannel.shutdown*

两者都可以接受并且合适。

clientCallStreamObserver.cancel() 通常更容易,因为它的样板更少。它通常应该是首选。然而,它不是thread-safe;这就像在 StreamObserver 上正常发送一样。它还需要 RPC 的直接感知;您不能让 higher-level 代码协调取消,因为它甚至可能不知道 RPC。

使用 Context 取消 thread-safe 取消,减少 RPC-aware 取消。上下文取消可用于类似于线程中断或 Future 取消的情况。并不是说 CancellableContexts 应该被视为一种资源并且最终必须被取消以避免内存泄漏。 (context.cancel(null) 可以在上下文达到其“正常”寿命结束时使用。)