【发布时间】:2021-01-17 16:08:01
【问题描述】:
我正在尝试实现一个异步 GRPC 服务器,每当客户端进行调用时,它都会获得无限的消息流。我通读了官方文档。它不包括我想为每个 RPC 保持流打开的场景。这篇文章-https://www.gresearch.co.uk/article/lessons-learnt-from-writing-asynchronous-streaming-grpc-services-in-c/ 通过基本上将回调处理程序对象再次放入完成队列来解决保持流打开的问题。
文章建议:
if (HasData())
{
responder_.Write(reply_, this);
}
else
{
grpc::Alarm alarm;
alarm.Set(completion_queue_, gpr_now(gpr_clock_type::GPR_CLOCK_REALTIME), this);
}
我尝试使用本文中建议的警报对象方法,但由于某种原因,在完成队列的下一个 Next 函数调用中,我得到 ok 参数为 false - GPR_ASSERT(cq_->Next(&tag, &ok));。结果,我不得不关闭服务器并且无法等待流,直到有更多数据可用。
在else 案例未命中之前,我可以正常接收数据。
有人可以帮我确定我可能做错了什么吗?我无法在 GRPC 上找到很多 C++ 资源。谢谢!
【问题讨论】: