onComplete/onCancel 是否保证用 grpc 调用?

yoh*_*han 4 grpc grpc-java

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

我使用 ServerCall.Listener:

  • 调用开始时执行的代码位于侦听器的构造函数中
  • 调用结束时执行的代码由 onComplete 和 onCancel 触发
  • 实例化侦听器的线程必须是调用 onComplete / onCancel 的线程(我们使用线程局部变量)

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

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

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

这些情况之一应该发生吗?我正在使用 grpc-netty 版本 1.6.1。

谢谢你的帮助 !

Eri*_*son 5

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

问题是“实例化侦听器的线程必须是调用 onComplete / onCancel 的线程”。这通常是不正确的,原因有多种:

  1. 侦听器创建发生在发送线程上,而回调则发生在单独的接收线程上。
  2. 接收线程不是专用线程:它是共享的,并且可以在回调之间切换。

Listener 不需要是线程安全的,但应该是线程兼容的。您当前的实现是线程敌对的

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