2017-01-19 5 views
3

Я знаю, что есть пример helloworld программы в gRPC источник. Однако, будучи новичком в этом, я не понимаю, как писать на сервере несколько асинхронных сервисов. В примере here рассказывается о появлении новых экземпляров класса для обработки вызовов SayHello.gRPC несколько сервисов в асинхронном сервере cpp

  1. Как добавить новые услуги, например SayBye, чтобы я мог звонить на него от клиента?
  2. Как заставить сервер идентифицировать, какой вызов службы был сделан клиентом?

ответ

5

См this thread и соответствующие example. Предложение заключается в том, чтобы добавить параметр bool к CallData (hello_ в данном примере), два экземпляра CallData объектов, один с hello_ = true, и один с hello_ = false, и имеют каждый один запрос на другую RPC.

if (hello_) { 
    service_->RequestSayHello(...); 
} else { 
    service_->RequestSayBye(...); 
} 

Для более двух типов вызовов, вы можете достичь того же поведения с enum вместо bool.

Более гибкий подход состоял бы в том, чтобы иметь для каждого RPC другой класс CallData-like . Однако, когда вы получаете тег от cq_->Next(), вы знаете, что это указатель на объект одного из этих классов, но вы не знаете его точного типа. Чтобы преодолеть это, вы можете иметь их все наследоваться от класса с виртуальной функцией Proceed() члена, реализовать его по мере необходимости в каждом подклассе, и когда вы получите тег, бросьте , как CallData и называете Proceed().

class CallData { 
public: 
    virtual void Proceed() = 0; 
}; 

class HelloCallData final : public CallData {...}; 
class ByeCallData final : public CallData {...}; 

... 
new HelloCallData(...); 
new ByeCallData(...); 
cq_->Next(&tag, &ok); 
static_cast<CallData*>(tag)->Proceed(); 
... 
Смежные вопросы