我正在运行连接到流服务的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();
}
我有这段代码的等效阻塞(同步读取器-> Read在while循环内被调用),它可以正确接收所有消息。但是,异步代码似乎仅获得第一条消息,而没有获得后续消息。
我可能误解了文档并做了些la脚的事情,但是有什么主意为什么只有第一条消息到达?
答案 0 :(得分:0)
在查看您的代码时,我看不到在while循环中的AsyncNext调用之后发出的reader-> Read,因此它只会收到一条消息。每个操作仅匹配一条消息。