如何取消 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 取消的情况。并不是说 CancellableContext
s 应该被视为一种资源并且最终必须被取消以避免内存泄漏。 (context.cancel(null)
可以在上下文达到其“正常”寿命结束时使用。)
通常,客户端可以通过以下方式取消 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 取消的情况。并不是说 CancellableContext
s 应该被视为一种资源并且最终必须被取消以避免内存泄漏。 (context.cancel(null)
可以在上下文达到其“正常”寿命结束时使用。)