@ -55,13 +55,18 @@ class ServerBuilder {
ServerBuilder ( ) ;
~ ServerBuilder ( ) ;
/// Options for synchronous servers.
enum SyncServerOption {
NUM_CQS , ///< Number of completion queues.
MIN_POLLERS , ///< Minimum number of polling threads.
MAX_POLLERS , ///< Maximum number of polling threads.
CQ_TIMEOUT_MSEC ///< Completion queue timeout in milliseconds.
} ;
//////////////////////////////////////////////////////////////////////////////
// Primary API's
/// Return a running server which is ready for processing calls.
/// Before calling, one typically needs to ensure that:
/// 1. a service is registered - so that the server knows what to serve
/// (via RegisterService, or RegisterAsyncGenericService)
/// 2. a listening port has been added - so the server knows where to receive
/// traffic (via AddListeningPort)
/// 3. [for async api only] completion queues have been added via
/// AddCompletionQueue
std : : unique_ptr < Server > BuildAndStart ( ) ;
/// Register a service. This call does not take ownership of the service.
/// The service must exist for the lifetime of the \a Server instance returned
@ -69,9 +74,60 @@ class ServerBuilder {
/// Matches requests with any :authority
ServerBuilder & RegisterService ( Service * service ) ;
/// Register a generic service.
/// Matches requests with any :authority
ServerBuilder & RegisterAsyncGenericService ( AsyncGenericService * service ) ;
/// Enlists an endpoint \a addr (port with an optional IP address) to
/// bind the \a grpc::Server object to be created to.
///
/// It can be invoked multiple times.
///
/// \param addr_uri The address to try to bind to the server in URI form. If
/// the scheme name is omitted, "dns:///" is assumed. To bind to any address,
/// please use IPv6 any, i.e., [::]:<port>, which also accepts IPv4
/// connections. Valid values include dns:///localhost:1234, /
/// 192.168.1.1:31416, dns:///[::1]:27182, etc.).
/// \param creds The credentials associated with the server.
/// \param selected_port[out] If not `nullptr`, gets populated with the port
/// number bound to the \a grpc::Server for the corresponding endpoint after
/// it is successfully bound, 0 otherwise.
///
ServerBuilder & AddListeningPort ( const grpc : : string & addr_uri ,
std : : shared_ptr < ServerCredentials > creds ,
int * selected_port = nullptr ) ;
/// Add a completion queue for handling asynchronous services.
///
/// Best performance is typically obtained by using one thread per polling
/// completion queue.
///
/// Caller is required to shutdown the server prior to shutting down the
/// returned completion queue. Caller is also required to drain the
/// completion queue after shutting it down. A typical usage scenario:
///
/// // While building the server:
/// ServerBuilder builder;
/// ...
/// cq_ = builder.AddCompletionQueue();
/// server_ = builder.BuildAndStart();
///
/// // While shutting down the server;
/// server_->Shutdown();
/// cq_->Shutdown(); // Always *after* the associated server's Shutdown()!
/// // Drain the cq_ that was created
/// void* ignored_tag;
/// bool ignored_ok;
/// while (cq_->Next(&ignored_tag, &ignored_ok)) { }
///
/// \param is_frequently_polled This is an optional parameter to inform gRPC
/// library about whether this completion queue would be frequently polled
/// (i.e. by calling \a Next() or \a AsyncNext()). The default value is
/// 'true' and is the recommended setting. Setting this to 'false' (i.e.
/// not polling the completion queue frequently) will have a significantly
/// negative performance impact and hence should not be used in production
/// use cases.
std : : unique_ptr < ServerCompletionQueue > AddCompletionQueue (
bool is_frequently_polled = true ) ;
//////////////////////////////////////////////////////////////////////////////
// RegisterService variants
/// Register a service. This call does not take ownership of the service.
/// The service must exist for the lifetime of the \a Server instance returned
@ -79,6 +135,13 @@ class ServerBuilder {
/// Only matches requests with :authority \a host
ServerBuilder & RegisterService ( const grpc : : string & host , Service * service ) ;
/// Register a generic service.
/// Matches requests with any :authority
ServerBuilder & RegisterAsyncGenericService ( AsyncGenericService * service ) ;
//////////////////////////////////////////////////////////////////////////////
// Fine control knobs
/// Set max receive message size in bytes.
ServerBuilder & SetMaxReceiveMessageSize ( int max_receive_message_size ) {
max_receive_message_size_ = max_receive_message_size ;
@ -119,6 +182,14 @@ class ServerBuilder {
ServerBuilder & SetOption ( std : : unique_ptr < ServerBuilderOption > option ) ;
/// Options for synchronous servers.
enum SyncServerOption {
NUM_CQS , ///< Number of completion queues.
MIN_POLLERS , ///< Minimum number of polling threads.
MAX_POLLERS , ///< Maximum number of polling threads.
CQ_TIMEOUT_MSEC ///< Completion queue timeout in milliseconds.
} ;
/// Only useful if this is a Synchronous server.
ServerBuilder & SetSyncServerOption ( SyncServerOption option , int value ) ;
@ -129,59 +200,6 @@ class ServerBuilder {
return SetOption ( MakeChannelArgumentOption ( arg , value ) ) ;
}
/// Enlists an endpoint \a addr (port with an optional IP address) to
/// bind the \a grpc::Server object to be created to.
///
/// It can be invoked multiple times.
///
/// \param addr_uri The address to try to bind to the server in URI form. If
/// the scheme name is omitted, "dns:///" is assumed. To bind to any address,
/// please use IPv6 any, i.e., [::]:<port>, which also accepts IPv4
/// connections. Valid values include dns:///localhost:1234, /
/// 192.168.1.1:31416, dns:///[::1]:27182, etc.).
/// \param creds The credentials associated with the server.
/// \param selected_port[out] If not `nullptr`, gets populated with the port
/// number bound to the \a grpc::Server for the corresponding endpoint after
/// it is successfully bound, 0 otherwise.
///
// TODO(dgq): the "port" part seems to be a misnomer.
ServerBuilder & AddListeningPort ( const grpc : : string & addr_uri ,
std : : shared_ptr < ServerCredentials > creds ,
int * selected_port = nullptr ) ;
/// Add a completion queue for handling asynchronous services.
///
/// Caller is required to shutdown the server prior to shutting down the
/// returned completion queue. Caller is also required to drain the
/// completion queue after shutting it down. A typical usage scenario:
///
/// // While building the server:
/// ServerBuilder builder;
/// ...
/// cq_ = builder.AddCompletionQueue();
/// server_ = builder.BuildAndStart();
///
/// // While shutting down the server;
/// server_->Shutdown();
/// cq_->Shutdown(); // Always *after* the associated server's Shutdown()!
/// // Drain the cq_ that was created
/// void* ignored_tag;
/// bool ignored_ok;
/// while (cq_->Next(&ignored_tag, &ignored_ok)) { }
///
/// \param is_frequently_polled This is an optional parameter to inform gRPC
/// library about whether this completion queue would be frequently polled
/// (i.e. by calling \a Next() or \a AsyncNext()). The default value is
/// 'true' and is the recommended setting. Setting this to 'false' (i.e.
/// not polling the completion queue frequently) will have a significantly
/// negative performance impact and hence should not be used in production
/// use cases.
std : : unique_ptr < ServerCompletionQueue > AddCompletionQueue (
bool is_frequently_polled = true ) ;
/// Return a running server which is ready for processing calls.
std : : unique_ptr < Server > BuildAndStart ( ) ;
/// For internal use only: Register a ServerBuilderPlugin factory function.
static void InternalAddPluginFactory (
std : : unique_ptr < ServerBuilderPlugin > ( * CreatePlugin ) ( ) ) ;