gRPC异步流客户端仅处理第一条消息(C ++)

时间:2019-12-04 22:57:11

标签: grpc

我正在运行连接到流服务的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脚的事情,但是有什么主意为什么只有第一条消息到达?

1 个答案:

答案 0 :(得分:0)

在查看您的代码时,我看不到在while循环中的AsyncNext调用之后发出的reader-> Read,因此它只会收到一条消息。每个操作仅匹配一条消息。