Last active
February 2, 2016 19:15
-
-
Save yang-g/143c12eca25f8f742134 to your computer and use it in GitHub Desktop.
example grpc ciena server
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Code sample. May need minor fixes to compile. | |
// Create a sync service handling class | |
class OpenConfigImpl : public openconfigs::OpenConfig::Service { | |
public: | |
::grpc::Status::Subscribe(::grpc::ServerContext* context, ::grpc::ServerReaderWriter<SubscribeResponse, SubscribeRequest>* stream) override; | |
::grpc::Status::Set(::grpc::ServerContext* context, ::grpc::ServerReaderWriter<SetResponse, SetRequest>* stream) override; | |
// Get will be handled async. | |
}; | |
// wrapper for data related with one async Get rpc | |
struct GetRpcData { | |
GetRequest get_request; | |
GetResponse get_response; | |
::grpc::ServerContext context; | |
::grpc::ServerAsyncResponseWriter<GetResponse> response_writer {&context}; | |
}; | |
// Request to handle a new Get rpc from library. | |
void RequestGet(::grpc::Service* service, ::grpc::ServerCompletionQueue* cq) { | |
// request a new rpc | |
auto* data = new GetRpcData; | |
service->RequestGet(&data->context, &data->get_request, &data->response_writer, cq, cq, new HandleRpcTag(service, cq, data)); | |
} | |
// Interface for completion queue tag | |
class TagInterface { | |
public: | |
virtual ~TagInterface() {}; | |
virtual void Run() = 0; | |
}; | |
class HandleRpcTag : public TagInterface { | |
public: | |
HandleRpcTag(::grpc::Service* service, ::grpc::ServerCompletionQueue* cq, GetRpcData* data) : service_(service), cq_(cq), data_(data) {} | |
void Run() override { | |
// Handle request, set response etc here | |
RequestGet(service_, cq_); | |
data_->response_writer->Finish(data->get_response, ::grpc::Status::OK, new DeleteRpcTag(data)); | |
delete this; | |
} | |
private: | |
::grpc::Service* service_; | |
::grpc::ServerCompletionQueue* cq_; | |
GetRpcData* data_; | |
}; | |
class DeleteRpcTag : public TagInterface { | |
public: | |
explicit DeleteRpcTag(GetRpcData* data) : data_(data) {} | |
void Run() override { delete data_; delete this; } | |
private: | |
GetRpcData* data_; | |
}; | |
void HandleGetRpcs(::grpc::CompletionQueue* cq) { | |
void* tag; | |
bool ok; | |
while (cq->Next(&tag, &ok)) { | |
static_cast<TagInterface *>(tag)->Run(); | |
} | |
} | |
int main() { | |
// Creating a service | |
openconfigs::OpenConfig::WithAsyncMethod_Get<OpenConfigImpl> service; | |
::grpc::ServerBuilder builder; | |
builder.AddListeningPort("0.0.0.0:12345", ::grpc::InsecureServerCredentials()); | |
builder.RegisterService(&service); | |
auto cq = builder.AddCompletionQueue(); | |
auto server = builder.BuildAndStart(); | |
RequestGet(&service, cq.get(); | |
// This can be run in multiple threads. | |
HandleGetRpcs(cq.get()); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment