onComplete/onCancel 保证用 grpc 调用吗?
Are onComplete/onCancel guaranteed to be called with grpc?
我应该在我的 grpc 服务器处理的每个调用的开始和结束时执行一些代码。
我使用 ServerCall.Listener:
- 调用开始时执行的代码位于监听器的构造函数中
- 调用结束时执行的代码由onComplete和onCancel触发
- 实例化侦听器的线程必须是将调用 onComplete / onCancel 的线程(我们正在使用线程局部变量)
侦听器由注册到我的服务器的拦截器实例化。
但有一个问题:有时,即使侦听器已被实例化,它后面也不会调用 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"。由于多种原因,这通常是不正确的:
- 侦听器创建发生在发送线程上,而回调发生在单独的接收线程上。
- 接收线程不是专用线程:它是共享的,可以从回调更改为回调。
监听器不必是thread-safe,但应该是thread-compatible。您当前的实施 is thread-hostile.
今天您的假设唯一成立的时间是使用阻塞存根时。但那是因为你不应该依赖一个实现细节。
我应该在我的 grpc 服务器处理的每个调用的开始和结束时执行一些代码。
我使用 ServerCall.Listener:
- 调用开始时执行的代码位于监听器的构造函数中
- 调用结束时执行的代码由onComplete和onCancel触发
- 实例化侦听器的线程必须是将调用 onComplete / onCancel 的线程(我们正在使用线程局部变量)
侦听器由注册到我的服务器的拦截器实例化。
但有一个问题:有时,即使侦听器已被实例化,它后面也不会调用 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"。由于多种原因,这通常是不正确的:
- 侦听器创建发生在发送线程上,而回调发生在单独的接收线程上。
- 接收线程不是专用线程:它是共享的,可以从回调更改为回调。
监听器不必是thread-safe,但应该是thread-compatible。您当前的实施 is thread-hostile.
今天您的假设唯一成立的时间是使用阻塞存根时。但那是因为你不应该依赖一个实现细节。