我正在尝试实现一个异步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);
}
我尝试使用本文中建议的Alarm对象方法,但由于某种原因,在完成队列上的下一个Next
函数调用中,我得到的ok
参数为false-GPR_ASSERT(cq_->Next(&tag, &ok));
。因此,我不得不关闭服务器,无法等待流,直到有更多数据可用。
我能够很好地接收数据,直到else
的情况没有被击中。
有人能帮我找出我可能做错了什么吗?我在GRPC上找不到太多C++资源。谢谢
-
当报警超出范围时,它将生成一个Cancel((,导致您获得!在Next((中确定。
-
如果你想使用这个,你需要将Alarm放入你的类范围并触发它:
std::unique_ptr<Alarm> alarm_;
alarm_.reset(new Alarm);
alarm_->Set(cq_, grpc_timeout_seconds_to_deadline(10), this);
从报警::设置:上的文档
在指定的完成队列cq上触发报警实例时间
一旦警报到期(截止日期(或被取消(请参阅取消(,带有标记标签的事件将添加到cq。如果警报过期事件的成功部分是真的,否则是假的取消(。