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 Details

  • Constructor Details

  • Method Details

    • forUnixDomain

      public static ClientConnector forUnixDomain(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
    • isIntrinsicallySecure

      public boolean isIntrinsicallySecure(SocketAddress address)
      Parameters:
      address - the SocketAddress to connect to
      Returns:
      whether the connection to the given SocketAddress is intrinsically secure
      See Also:
    • getExecutor

      public Executor getExecutor()
    • setExecutor

      public void setExecutor(Executor executor)
    • getScheduler

      public Scheduler getScheduler()
    • setScheduler

      public void setScheduler(Scheduler scheduler)
    • getByteBufferPool

      public ByteBufferPool getByteBufferPool()
    • setByteBufferPool

      public void setByteBufferPool(ByteBufferPool byteBufferPool)
    • getSslContextFactory

      public SslContextFactory.Client getSslContextFactory()
    • setSslContextFactory

      public void setSslContextFactory(SslContextFactory.Client sslContextFactory)
    • 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)
    • getConnectTimeout

      @ManagedAttribute("The timeout of connect operations") public Duration getConnectTimeout()
      Returns:
      the timeout of connect(SocketAddress, Map) operations
    • setConnectTimeout

      public void setConnectTimeout(Duration connectTimeout)
    • getIdleTimeout

      @ManagedAttribute("The duration for which a connection can be idle") public 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(Duration idleTimeout)
    • getBindAddress

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

      public void setBindAddress(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:
    • 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 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.
      Exception - If there was a problem starting. Will cause a transition to FAILED state
    • doStop

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

      protected SslContextFactory.Client newSslContextFactory()
    • newSelectorManager

      protected SelectorManager newSelectorManager()
    • connect

      public void connect(SocketAddress address, Map<String,Object> context)
    • accept

      public void accept(SelectableChannel selectable, Map<String,Object> context)
    • configure

      protected void configure(SelectableChannel selectable) throws IOException
      Throws:
      IOException
    • newEndPoint

      protected EndPoint newEndPoint(SelectableChannel selectable, ManagedSelector selector, SelectionKey selectionKey)
    • newConnection

      protected Connection newConnection(EndPoint endPoint, Map<String,Object> context) throws IOException
      Throws:
      IOException
    • connectFailed

      protected void connectFailed(Throwable failure, Map<String,Object> context)