gRPC 双向流媒体服务器可以向当前没有响应的客户端发送消息吗?

时间:2021-01-11 10:58:56

标签: java grpc grpc-java

gRPC 双向流媒体服务器是否可以乱序响应客户端?
网络上的所有示例都显示服务器仅响应传入请求。
StreamObserver 接口包含响应请求的响应
onNext方法中,StreamObserver参数是否可以缓存并在以后重用以发送消息?
我需要什么:
我在第一次请求 Client1 时缓存了 StreamObserver
应客户2的请求,我需要向客户1

发送消息

使用缓存的 StreamObserver 对象会引发 CANCELED 错误,我注意到 onComplete 被调用用于来自 Client1 的第一个请求
有没有办法做到这一点 ?
This 似乎是一个类似的问题,但在 2015 年不受支持,我不确定现在是否可行

1 个答案:

答案 0 :(得分:0)

一旦服务器收到 StreamObserver 以响应客户端,它可以随时从任何线程调用该对象(尽管该对象不是线程安全的,因此不允许并发调用)。无需将其与 onNext() 中的传入请求耦合。

客户端调用onComplete()是正常的,不会结束RPC。但是,如果您的代码转向并调用 onComplete(),那么此时您将无法再在流上发送任何消息。您可能希望观察客户端取消,这可以通过将 StreamObserver 强制转换为 ServerCallStreamObserver 并在 RPC 开始时调用 setOnCancelHandler(Runnable) 来实现。