async grpc сервер, обрабатывающий несколько типов запросов - PullRequest
0 голосов
/ 25 января 2019

Есть ли лучший пример того, как реализовать несколько асинхронных запросов.

 // The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc ListSayHello1 (HelloRequest1) returns (stream HelloReply1) {}
  rpc ListSayHello2 (HelloRequest2) returns (stream HelloReply2) {}
}

// The request message containing the user's name.
message HelloRequest1 {
  string name = 1;
}

message HelloRequest2 {
  string name = 1;
}

// The response message containing the greetings
message HelloReply1 {
  string message = 1;
}

message HelloReply2 {
  string message = 1;
}

Я использую приведенный ниже асинхронный шаблон для обработки SayHello1, но теперь я хочу добавить поддержку SayHello2.Какой должен быть подход?

 new CallData(&service_, cq_.get(), *this);
    void* tag;  // uniquely identifies a request.
    bool ok;
    while (true) {
        // Block waiting to read the next event from the completion queue. The
        // event is uniquely identified by its tag, which in this case is the
        // memory address of a CallData instance.
        // The return value of Next should always be checked. This return value
        // tells us whether there is any kind of event or cq_ is shutting down.
        GPR_ASSERT(cq_->Next(&tag, &ok));
        GPR_ASSERT(ok);
        static_cast<CallData*>(tag)->Proceed();
    }

В CallData я делаю это

void CallData::Proceed()
{
    if (status_ == CREATE) {

        status_ = PROCESS;
        service_->RequestListSayHello1(&ctx_, &request_, &writer_, cq_, cq_,
            this);
    }
... 
}

1 Ответ

0 голосов
/ 28 января 2019

Я смог понять это.Для каждой функции protobuf мне приходилось создавать отдельную очередь завершения.

...