【发布时间】:2020-03-29 19:58:42
【问题描述】:
我正在运行一个连接到流服务的 gRPC 客户端。服务器总是在收到客户端请求消息后立即发送至少一个响应消息。服务器可能随时发送更多消息,也可能不发送,但客户端继续处理直到关闭。一般来说,客户端的生命周期明显短于服务端,需要随时关闭。
我的目的是编写一个客户端,该客户端将对流式消息进行异步读取,直到收到停止运行的信号。这是客户端,省略了处理:
void FooClient::WatchFoo(bool& done_)
{
WatchFooRequest request;
WatchFooResponse reply;
ClientContext context;
CompletionQueue cq;
Status status;
void* got_tag;
bool ok;
std::unique_ptr<ClientAsyncReader<WatchFooResponse> >
reader(stub_->PrepareAsyncWatchFoo(&context, request, &cq));
reader->StartCall((void*)1);
reader->Read(&reply, (void*)1);
std::chrono::system_clock::time_point mytp(std::chrono::system_clock::now());
// continue processing messages in a loop until done becomes true
while (!done_) {
mytp += std::chrono:seconds(1);
auto next_status = cq.AsyncNext<std::chrono::system_clock::time_point>(&got_tag, &ok, mytp);
if (!ok || next_status == CompletionQueue::NextStatus::SHUTDOWN) {
break;
}
if (next_status == CompletionQueue::NextStatus::TIMEOUT) {
continue;
}
// process reply
// ...
}
context.TryCancel();
reader->Finish(&status, (void*)1);
cq.Shutdown();
}
我有这段代码的阻塞等效项(同步读取器->在 while 循环中调用读取),它可以正确接收所有消息。但是,异步代码似乎只获取第一条消息,而没有获取后续消息。
我可能误解了文档并做了一些蹩脚的事情,但有什么想法为什么只有第一条消息到达?
【问题讨论】:
标签: grpc