Class AprEndpoint

  • All Implemented Interfaces:
    SSLContext.SNICallBack

    public class AprEndpoint
    extends AbstractEndpoint<java.lang.Long,​java.lang.Long>
    implements SSLContext.SNICallBack
    APR tailored thread pool, providing the following services:
    • Socket acceptor thread
    • Socket poller thread
    • Sendfile thread
    • Worker threads pool
    When switching to Java 5, there's an opportunity to use the virtual machine's thread pool.
    Author:
    Mladen Turk, Remy Maucherat
    • Field Detail

      • rootPool

        protected long rootPool
        Root APR memory pool.
      • serverSock

        protected volatile long serverSock
        Server socket "pointer".
      • serverSockPool

        protected long serverSockPool
        APR memory pool for the server socket.
      • sslContext

        protected long sslContext
        SSL context.
      • deferAccept

        protected boolean deferAccept
        Defer accept.
      • sendfileSize

        protected int sendfileSize
        Size of the sendfile (= concurrent files which can be served).
      • pollTime

        protected int pollTime
        Poll interval, in microseconds. The smaller the value, the more CPU the poller will use, but the more responsive to activity it will be.
    • Constructor Detail

      • AprEndpoint

        public AprEndpoint()
    • Method Detail

      • setDeferAccept

        public void setDeferAccept​(boolean deferAccept)
      • setIpv6v6only

        public void setIpv6v6only​(boolean ipv6v6only)
      • getIpv6v6only

        public boolean getIpv6v6only()
      • setSendfileSize

        public void setSendfileSize​(int sendfileSize)
      • getSendfileSize

        public int getSendfileSize()
      • getPollTime

        public int getPollTime()
      • setPollTime

        public void setPollTime​(int pollTime)
      • setUseSendfile

        public void setUseSendfile​(boolean useSendfile)
        Overrides:
        setUseSendfile in class AbstractEndpoint<java.lang.Long,​java.lang.Long>
      • getLocalAddress

        public java.net.InetSocketAddress getLocalAddress()
                                                   throws java.io.IOException
        Description copied from class: AbstractEndpoint
        Obtain the network address the server socket is bound to. This primarily exists to enable the correct address to be used when unlocking the server socket since it removes the guess-work involved if no address is specifically set.
        Specified by:
        getLocalAddress in class AbstractEndpoint<java.lang.Long,​java.lang.Long>
        Returns:
        The network address that the server socket is listening on or null if the server socket is not currently bound.
        Throws:
        java.io.IOException - If there is a problem determining the currently bound socket
      • setMaxConnections

        public void setMaxConnections​(int maxConnections)
        This endpoint does not support -1 for unlimited connections, nor does it support setting this attribute while the endpoint is running.
        Overrides:
        setMaxConnections in class AbstractEndpoint<java.lang.Long,​java.lang.Long>
      • getKeepAliveCount

        public int getKeepAliveCount()
        Obtain the number of kept alive sockets.
        Returns:
        The number of open sockets currently managed by the Poller
      • getSendfileCount

        public int getSendfileCount()
        Obtain the number of sendfile sockets.
        Returns:
        The number of sockets currently managed by the Sendfile poller.
      • bind

        public void bind()
                  throws java.lang.Exception
        Initialize the endpoint.
        Specified by:
        bind in class AbstractEndpoint<java.lang.Long,​java.lang.Long>
        Throws:
        java.lang.Exception
      • createSSLContext

        protected void createSSLContext​(SSLHostConfig sslHostConfig)
                                 throws java.lang.Exception
        Description copied from class: AbstractEndpoint
        Create the SSLContextfor the the given SSLHostConfig.
        Specified by:
        createSSLContext in class AbstractEndpoint<java.lang.Long,​java.lang.Long>
        Parameters:
        sslHostConfig - The SSLHostConfig for which the SSLContext should be created
        Throws:
        java.lang.Exception - If the SSLContext cannot be created for the given SSLHostConfig
      • getSslContext

        public long getSslContext​(java.lang.String sniHostName)
        Description copied from interface: SSLContext.SNICallBack
        This callback is made during the TLS handshake when the client uses the SNI extension to request a specific TLS host.
        Specified by:
        getSslContext in interface SSLContext.SNICallBack
        Parameters:
        sniHostName - The host name requested by the client
        Returns:
        The Java representation of the pointer to the OpenSSL SSLContext to use for the given host or zero if no SSLContext could be identified
      • isAlpnSupported

        public boolean isAlpnSupported()
        Description copied from class: AbstractEndpoint
        Identifies if the endpoint supports ALPN. Note that a return value of true implies that AbstractEndpoint.isSSLEnabled() will also return true.
        Specified by:
        isAlpnSupported in class AbstractEndpoint<java.lang.Long,​java.lang.Long>
        Returns:
        true if the endpoint supports ALPN in its current configuration, otherwise false.
      • startInternal

        public void startInternal()
                           throws java.lang.Exception
        Start the APR endpoint, creating acceptor, poller and sendfile threads.
        Specified by:
        startInternal in class AbstractEndpoint<java.lang.Long,​java.lang.Long>
        Throws:
        java.lang.Exception
      • stopInternal

        public void stopInternal()
        Stop the endpoint. This will cause all processing threads to stop.
        Specified by:
        stopInternal in class AbstractEndpoint<java.lang.Long,​java.lang.Long>
      • unbind

        public void unbind()
                    throws java.lang.Exception
        Deallocate APR memory pools, and close server socket.
        Specified by:
        unbind in class AbstractEndpoint<java.lang.Long,​java.lang.Long>
        Throws:
        java.lang.Exception
      • doCloseServerSocket

        protected void doCloseServerSocket()
        Description copied from class: AbstractEndpoint
        Actually close the server socket but don't perform any other clean-up.
        Specified by:
        doCloseServerSocket in class AbstractEndpoint<java.lang.Long,​java.lang.Long>
      • setSocketOptions

        protected boolean setSocketOptions​(SocketWrapperBase<java.lang.Long> socketWrapper)
        Process the specified connection.
        Parameters:
        socketWrapper - The socket wrapper
        Returns:
        true if the socket was correctly configured and processing may continue, false if the socket needs to be close immediately
      • allocatePoller

        protected long allocatePoller​(int size,
                                      long pool,
                                      int timeout)
        Allocate a new poller of the specified size.
        Parameters:
        size - The size
        pool - The pool from which the poller will be allocated
        timeout - The timeout
        Returns:
        the poller pointer
      • setSocketOptions

        protected boolean setSocketOptions​(java.lang.Long socket)
        Process given socket. This is called when the socket has been accepted.
        Specified by:
        setSocketOptions in class AbstractEndpoint<java.lang.Long,​java.lang.Long>
        Parameters:
        socket - The socket
        Returns:
        true if the socket was correctly configured and processing may continue, false if the socket needs to be close immediately
      • serverSocketAccept

        protected java.lang.Long serverSocketAccept()
                                             throws java.lang.Exception
        Specified by:
        serverSocketAccept in class AbstractEndpoint<java.lang.Long,​java.lang.Long>
        Throws:
        java.lang.Exception
      • processSocket

        protected boolean processSocket​(long socket,
                                        SocketEvent event)
        Process the given socket. Typically keep alive or upgraded protocol.
        Parameters:
        socket - The socket to process
        event - The event to process
        Returns:
        true if the processing completed normally otherwise false which indicates an error occurred and that the socket should be closed
      • destroySocket

        protected void destroySocket​(java.lang.Long socket)
        Description copied from class: AbstractEndpoint
        Close the socket. This is used when the connector is not in a state which allows processing the socket, or if there was an error which prevented the allocation of the socket wrapper.
        Specified by:
        destroySocket in class AbstractEndpoint<java.lang.Long,​java.lang.Long>
        Parameters:
        socket - The newly accepted socket