如何在C++中将事件添加到grpc完成队列



我正在尝试实现一个异步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++资源。谢谢

  1. 当报警超出范围时,它将生成一个Cancel((,导致您获得!在Next((中确定。

  2. 如果你想使用这个,你需要将Alarm放入你的类范围并触发它:

std::unique_ptr<Alarm> alarm_;
alarm_.reset(new Alarm);
alarm_->Set(cq_, grpc_timeout_seconds_to_deadline(10), this);

从报警::设置:上的文档

在指定的完成队列cq上触发报警实例时间

一旦警报到期(截止日期(或被取消(请参阅取消(,带有标记标签的事件将添加到cq。如果警报过期事件的成功部分是真的,否则是假的取消(。

最新更新