Class ClientConnector

  • All Implemented Interfaces:
    Container, Destroyable, Dumpable, Dumpable.DumpableContainer, LifeCycle

    @ManagedObject
    public class ClientConnector
    extends ContainerLifeCycle

    The client-side component that connects to server sockets.

    ClientConnector delegates the handling of SocketChannels to a SelectorManager, and centralizes the configuration of necessary components such as the executor, the scheduler, etc.

    ClientConnector offers a low-level API that can be used to connect SocketChannels to listening servers via the connect(SocketAddress, Map) method.

    However, a ClientConnector instance is typically just configured and then passed to an HttpClient transport, so that applications can use high-level APIs to make HTTP requests to servers:

     // Create a ClientConnector instance.
     ClientConnector connector = new ClientConnector();
    
     // Configure the ClientConnector.
     connector.setSelectors(1);
     connector.setSslContextFactory(new SslContextFactory.Client());
    
     // Pass it to the HttpClient transport.
     HttpClientTransport transport = new HttpClientTransportDynamic(connector);
     HttpClient httpClient = new HttpClient(transport);
     httpClient.start();
     
    • Field Detail

      • CLIENT_CONNECTOR_CONTEXT_KEY

        public static final java.lang.String CLIENT_CONNECTOR_CONTEXT_KEY
        See Also:
        Constant Field Values
      • REMOTE_SOCKET_ADDRESS_CONTEXT_KEY

        public static final java.lang.String REMOTE_SOCKET_ADDRESS_CONTEXT_KEY
        See Also:
        Constant Field Values
      • CLIENT_CONNECTION_FACTORY_CONTEXT_KEY

        public static final java.lang.String CLIENT_CONNECTION_FACTORY_CONTEXT_KEY
        See Also:
        Constant Field Values
      • CONNECTION_PROMISE_CONTEXT_KEY

        public static final java.lang.String CONNECTION_PROMISE_CONTEXT_KEY
        See Also:
        Constant Field Values
    • Constructor Detail

      • ClientConnector

        public ClientConnector()
    • Method Detail

      • forUnixDomain

        public static ClientConnector forUnixDomain​(java.nio.file.Path path)

        Creates a ClientConnector configured to connect via Unix-Domain sockets to the given Unix-Domain path

        Parameters:
        path - the Unix-Domain path to connect to
        Returns:
        a ClientConnector that connects to the given Unix-Domain path
      • getExecutor

        public java.util.concurrent.Executor getExecutor()
      • setExecutor

        public void setExecutor​(java.util.concurrent.Executor executor)
      • getScheduler

        public Scheduler getScheduler()
      • setScheduler

        public void setScheduler​(Scheduler scheduler)
      • setByteBufferPool

        public void setByteBufferPool​(ByteBufferPool byteBufferPool)
      • getSelectors

        @ManagedAttribute("The number of NIO selectors")
        public int getSelectors()
        Returns:
        the number of NIO selectors
      • setSelectors

        public void setSelectors​(int selectors)
      • isConnectBlocking

        @ManagedAttribute("Whether connect operations are performed in blocking mode")
        public boolean isConnectBlocking()
        Returns:
        whether connect(SocketAddress, Map) operations are performed in blocking mode
      • setConnectBlocking

        public void setConnectBlocking​(boolean connectBlocking)
      • setConnectTimeout

        public void setConnectTimeout​(java.time.Duration connectTimeout)
      • getIdleTimeout

        @ManagedAttribute("The duration for which a connection can be idle")
        public java.time.Duration getIdleTimeout()
        Returns:
        the max duration for which a connection can be idle (that is, without traffic of bytes in either direction)
      • setIdleTimeout

        public void setIdleTimeout​(java.time.Duration idleTimeout)
      • getBindAddress

        @ManagedAttribute("The socket address to bind sockets to before the connect operation")
        public java.net.SocketAddress getBindAddress()
        Returns:
        the address to bind a socket to before the connect operation
      • setBindAddress

        public void setBindAddress​(java.net.SocketAddress bindAddress)

        Sets the bind address of sockets before the connect operation.

        In multi-homed hosts, you may want to connect from a specific address:

         clientConnector.setBindAddress(new InetSocketAddress("127.0.0.2", 0));
         

        Note the use of the port 0 to indicate that a different ephemeral port should be used for each different connection.

        In the rare cases where you want to use the same port for all connections, you must also call setReusePort(true).

        Parameters:
        bindAddress - the socket address to bind to before the connect operation
      • isTCPNoDelay

        @ManagedAttribute("Whether small TCP packets are sent without delay")
        public boolean isTCPNoDelay()
        Returns:
        whether small TCP packets are sent without delay
      • setTCPNoDelay

        public void setTCPNoDelay​(boolean tcpNoDelay)
      • getReuseAddress

        @ManagedAttribute("Whether rebinding is allowed with sockets in tear-down states")
        public boolean getReuseAddress()
        Returns:
        whether rebinding is allowed with sockets in tear-down states
      • setReuseAddress

        public void setReuseAddress​(boolean reuseAddress)

        Sets whether it is allowed to bind a socket to a socket address that may be in use by another socket in tear-down state, for example in TIME_WAIT state.

        This is useful when ClientConnector is restarted: an existing connection may still be using a network address (same host and same port) that is also chosen for a new connection.

        Parameters:
        reuseAddress - whether rebinding is allowed with sockets in tear-down states
        See Also:
        setReusePort(boolean)
      • isReusePort

        @ManagedAttribute("Whether binding to same host and port is allowed")
        public boolean isReusePort()
        Returns:
        whether binding to same host and port is allowed
      • setReusePort

        public void setReusePort​(boolean reusePort)

        Sets whether it is allowed to bind multiple sockets to the same socket address (same host and same port).

        Parameters:
        reusePort - whether binding to same host and port is allowed
      • getReceiveBufferSize

        @ManagedAttribute("The receive buffer size in bytes")
        public int getReceiveBufferSize()
        Returns:
        the receive buffer size in bytes, or -1 for the default value
      • setReceiveBufferSize

        public void setReceiveBufferSize​(int receiveBufferSize)
      • getSendBufferSize

        @ManagedAttribute("The send buffer size in bytes")
        public int getSendBufferSize()
        Returns:
        the send buffer size in bytes, or -1 for the default value
      • setSendBufferSize

        public void setSendBufferSize​(int sendBufferSize)
      • doStart

        protected void doStart()
                        throws java.lang.Exception
        Description copied from class: ContainerLifeCycle
        Starts the managed lifecycle beans in the order they were added.
        Overrides:
        doStart in class ContainerLifeCycle
        Throws:
        AbstractLifeCycle.StopException - If thrown, the lifecycle will immediately be stopped.
        java.lang.Exception - If there was a problem starting. Will cause a transition to FAILED state
      • doStop

        protected void doStop()
                       throws java.lang.Exception
        Description copied from class: ContainerLifeCycle
        Stops the managed lifecycle beans in the reverse order they were added.
        Overrides:
        doStop in class ContainerLifeCycle
        Throws:
        java.lang.Exception - If there was a problem stopping. Will cause a transition to FAILED state
      • connect

        public void connect​(java.net.SocketAddress address,
                            java.util.Map<java.lang.String,​java.lang.Object> context)
      • accept

        public void accept​(java.nio.channels.SocketChannel channel,
                           java.util.Map<java.lang.String,​java.lang.Object> context)
      • configure

        protected void configure​(java.nio.channels.SocketChannel channel)
                          throws java.io.IOException
        Throws:
        java.io.IOException
      • newEndPoint

        protected EndPoint newEndPoint​(java.nio.channels.SocketChannel channel,
                                       ManagedSelector selector,
                                       java.nio.channels.SelectionKey selectionKey)
      • connectFailed

        protected void connectFailed​(java.lang.Throwable failure,
                                     java.util.Map<java.lang.String,​java.lang.Object> context)