onComplete/onCancel 保证用 grpc 调用吗?

Are onComplete/onCancel guaranteed to be called with grpc?

我应该在我的 grpc 服务器处理的每个调用的开始和结束时执行一些代码。

我使用 ServerCall.Listener:

侦听器由注册到我的服务器的拦截器实例化。

但有一个问题:有时,即使侦听器已被实例化,它后面也不会调用 onComplete 或 onCancel。

为了完全准确,如果另一个线程而不是实例化侦听器的线程正在调用 onComplete / onCancel,也可能会触发该问题。

其中一种情况应该发生吗?我正在使用 grpc-netty 版本 1.6.1.

谢谢你的帮助!

保证 onComplete / onCancel 中的一个将被调用。

问题是"the thread instantiating the listener must be the one that will call onComplete / onCancel"。由于多种原因,这通常是不正确的:

  1. 侦听器创建发生在发送线程上,而回调发生在单独的接收线程上。
  2. 接收线程不是专用线程:它是共享的,可以从回调更改为回调。

监听器不必是thread-safe,但应该是thread-compatible。您当前的实施 is thread-hostile.

今天您的假设唯一成立的时间是使用阻塞存根时。但那是因为你不应该依赖一个实现细节。