Class ServerImpl

  • All Implemented Interfaces:
    InternalInstrumented<InternalChannelz.ServerStats>, InternalWithLogId

    public final class ServerImpl
    extends Server
    implements InternalInstrumented<InternalChannelz.ServerStats>
    Default implementation of Server, for creation by transports.

    Expected usage (by a theoretical TCP transport):

    public class TcpTransportServerFactory {
       public static Server newServer(Executor executor, HandlerRegistry registry,
           String configuration) {
         return new ServerImpl(executor, registry, new TcpTransportServer(configuration));
       }
     }

    Starting the server starts the underlying transport for servicing requests. Stopping the server stops servicing new requests and waits for all connections to terminate.

    • Field Detail

      • log

        private static final java.util.logging.Logger log
      • executorPool

        private final ObjectPool<? extends java.util.concurrent.Executor> executorPool
      • executor

        private java.util.concurrent.Executor executor
        Executor for application processing. Safe to read after start().
      • handshakeTimeoutMillis

        private final long handshakeTimeoutMillis
      • started

        private boolean started
      • shutdown

        private boolean shutdown
      • shutdownNowStatus

        private Status shutdownNowStatus
        non-null if immediate shutdown has been requested.
      • serverShutdownCallbackInvoked

        private boolean serverShutdownCallbackInvoked
        true if ServerListenerImpl.serverShutdown() was called.
      • terminated

        private boolean terminated
      • transportServer

        private final InternalServer transportServer
        Service encapsulating something similar to an accept() socket.
      • lock

        private final java.lang.Object lock
      • transportServersTerminated

        private boolean transportServersTerminated
      • transports

        private final java.util.Set<ServerTransport> transports
        transportServer and services encapsulating something similar to a TCP connection.
      • rootContext

        private final Context rootContext
      • serverCallTracer

        private final CallTracer serverCallTracer
    • Constructor Detail

      • ServerImpl

        ServerImpl​(ServerImplBuilder builder,
                   InternalServer transportServer,
                   Context rootContext)
        Construct a server.
        Parameters:
        builder - builder with configuration for server
        transportServer - transport servers that will create new incoming transports
        rootContext - context that callbacks for new RPCs should be derived from
    • Method Detail

      • start

        public ServerImpl start()
                         throws java.io.IOException
        Bind and start the server.
        Specified by:
        start in class Server
        Returns:
        this object
        Throws:
        java.lang.IllegalStateException - if already started
        java.io.IOException - if unable to bind
      • getPort

        public int getPort()
        Description copied from class: Server
        Returns the port number the server is listening on. This can return -1 if there is no actual port or the result otherwise does not make sense. Result is undefined after the server is terminated. If there are multiple possible ports, this will return one arbitrarily. Implementations are encouraged to return the same port on each call.
        Overrides:
        getPort in class Server
        See Also:
        Server.getListenSockets()
      • getListenSockets

        public java.util.List<java.net.SocketAddress> getListenSockets()
        Description copied from class: Server
        Returns a list of listening sockets for this server. May be different than the originally requested sockets (e.g. listening on port '0' may end up listening on a different port). The list is unmodifiable.
        Overrides:
        getListenSockets in class Server
      • getListenSocketsIgnoringLifecycle

        private java.util.List<java.net.SocketAddress> getListenSocketsIgnoringLifecycle()
      • getServices

        public java.util.List<ServerServiceDefinition> getServices()
        Description copied from class: Server
        Returns all services registered with the server, or an empty list if not supported by the implementation.
        Overrides:
        getServices in class Server
      • getImmutableServices

        public java.util.List<ServerServiceDefinition> getImmutableServices()
        Description copied from class: Server
        Returns immutable services registered with the server, or an empty list if not supported by the implementation.
        Overrides:
        getImmutableServices in class Server
      • getMutableServices

        public java.util.List<ServerServiceDefinition> getMutableServices()
        Description copied from class: Server
        Returns mutable services registered with the server, or an empty list if not supported by the implementation.
        Overrides:
        getMutableServices in class Server
      • shutdown

        public ServerImpl shutdown()
        Initiates an orderly shutdown in which preexisting calls continue but new calls are rejected.
        Specified by:
        shutdown in class Server
        Returns:
        this object
      • shutdownNow

        public ServerImpl shutdownNow()
        Description copied from class: Server
        Initiates a forceful shutdown in which preexisting and new calls are rejected. Although forceful, the shutdown process is still not instantaneous; Server.isTerminated() will likely return false immediately after this method returns. After this call returns, this server has released the listening socket(s) and may be reused by another server.

        Calling this method before start() will shut down and terminate the server like normal, but prevents starting the server in the future.

        Specified by:
        shutdownNow in class Server
        Returns:
        this object
      • isShutdown

        public boolean isShutdown()
        Description copied from class: Server
        Returns whether the server is shutdown. Shutdown servers reject any new calls, but may still have some calls being processed.
        Specified by:
        isShutdown in class Server
        See Also:
        Server.shutdown(), Server.isTerminated()
      • awaitTermination

        public boolean awaitTermination​(long timeout,
                                        java.util.concurrent.TimeUnit unit)
                                 throws java.lang.InterruptedException
        Description copied from class: Server
        Waits for the server to become terminated, giving up if the timeout is reached.

        Calling this method before start() or shutdown() is permitted and does not change its behavior.

        Specified by:
        awaitTermination in class Server
        Returns:
        whether the server is terminated, as would be done by Server.isTerminated().
        Throws:
        java.lang.InterruptedException
      • awaitTermination

        public void awaitTermination()
                              throws java.lang.InterruptedException
        Description copied from class: Server
        Waits for the server to become terminated.

        Calling this method before start() or shutdown() is permitted and does not change its behavior.

        Specified by:
        awaitTermination in class Server
        Throws:
        java.lang.InterruptedException
      • isTerminated

        public boolean isTerminated()
        Description copied from class: Server
        Returns whether the server is terminated. Terminated servers have no running calls and relevant resources released (like TCP connections).
        Specified by:
        isTerminated in class Server
        See Also:
        Server.isShutdown()
      • transportClosed

        private void transportClosed​(ServerTransport transport)
        Remove transport service from accounting collection and notify of complete shutdown if necessary.
        Parameters:
        transport - service to remove
      • checkForTermination

        private void checkForTermination()
        Notify of complete shutdown if necessary.
      • getLogId

        public InternalLogId getLogId()
        Description copied from interface: InternalWithLogId
        Returns an ID that is primarily used in debug logs. It usually contains the class name and a numeric ID that is unique among the instances.

        The subclasses of this interface usually want to include the log ID in their Object.toString() results.

        Specified by:
        getLogId in interface InternalWithLogId
      • toString

        public java.lang.String toString()
        Overrides:
        toString in class java.lang.Object