如何取消GRPC流式通话?

时间:2020-08-04 15:52:30

标签: grpc grpc-java

通常,客户端可以使用以下命令取消gRPC调用:

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

但是,它显示在Javadoc中:

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

取消客户呼叫并通知服务器的“正确”方法是哪种?

编辑:

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

1 个答案:

答案 0 :(得分:1)

两者都是可接受且适当的。

adView = (AdView)findViewById(R.id.ads); adrequest =new AdRequest.Builder().build ; adView.loadAd(adrequest); 通常比较容易,因为它的样板更少。通常应首选。但是,它不是线程安全的。就像在StreamObserver上正常发送一样。它还需要对RPC有直接的了解;您可能没有更高级的代码来协调取消操作,因为它甚至可能不知道RPC。

使用clientCallStreamObserver.cancel()取消进行线程安全的取消,并减少对RPC的了解。可以在类似于线程中断或将来取消的情况下使用上下文取消。并非Context应该被视为资源,并且最终必须取消它们,以避免泄漏内存。 (当上下文达到其“正常”使用寿命时,可以使用CancellableContext。)