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

时间:2018-02-20 11:15:21

标签: grpc grpc-java

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

我使用ServerCall.Listener:

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

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

但是有一个问题:它看起来有时候,即使监听器已被实例化,也不会调用onComplete或onCancel。

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

是否应该发生其中一种情况?我使用的是grpc-netty版本1.6.1。

谢谢你的帮助!

1 个答案:

答案 0 :(得分:3)

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

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

  1. 侦听器创建发生在发送线程上,而回调则位于单独的接收线程上。
  2. 接收线程不是专用线程:它是共享的,可以从回调更改为回调。
  3. 监听器不需要是线程安全的,但应该是线程兼容的。您当前的实施is thread-hostile

    今天你的假设唯一一次是使用阻塞存根。但这是因为您不应该依赖的实施细节。