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

时间:2020-10-01 22:04:45

标签: 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);
}

我尝试按照本文中的建议使用“警报”对象方法,但是由于某些原因,在完成队列上的下一个Next函数调用中,我将ok的参数设为false-GPR_ASSERT(cq_->Next(&tag, &ok));。结果,我不得不关闭服务器,无法等待流,直到有更多数据可用。

else案件没有被提出之前,我可以很好地接收数据。

有人可以帮助我确定我可能做错了什么吗?我在GRPC上找不到很多C ++资源。谢谢!

1 个答案:

答案 0 :(得分:1)

  1. 当Alarm超出范围时,它将生成一个Cancel(),使您在Next()中获得!ok。

  2. 如果要使用此功能,则需要将Alarm放入类范围并触发它:

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

有关Alarm :: Set的文档,

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

一旦警报过期(在截止日期前)或被取消(请参阅取消), 带有标签标签的事件将添加到cq。如果警报过期,则 事件的成功位将为true,否则为false(即 取消)。