org.apache.hc.client5.http.impl.routing

## Class DistributedProxySelector

- java.lang.Object
- - java.net.ProxySelector
  - - org.apache.hc.client5.http.impl.routing.DistributedProxySelector

    @Contract(threading=SAFE)
    public class DistributedProxySelector
    extends ProxySelector

A DistributedProxySelector is a custom `ProxySelector` implementation that delegates proxy selection to a list of underlying ProxySelectors in a distributed manner. It ensures that proxy selection is load-balanced across the available ProxySelectors, and provides thread safety by maintaining separate states for each thread.

The DistributedProxySelector class maintains a list of ProxySelectors, a `ThreadLocal` variable for the current `ProxySelector`, and an `AtomicInteger` to keep track of the shared index across all threads. When the select() method is called, it delegates the proxy selection to the current ProxySelector or the next available one in the list if the current one returns an empty proxy list. Any exceptions that occur during proxy selection are caught and ignored, and the next ProxySelector is tried.

The connectFailed() method notifies the active `ProxySelector` of a connection failure, allowing the underlying ProxySelector to handle connection failures according to its own logic.

Since:
  5.3

### Constructor Summary

Constructors
Constructor and Description
`DistributedProxySelector(List<ProxySelector> selectors)` Constructs a DistributedProxySelector with the given list of `ProxySelector`.

### Method Summary

All Methods Instance Methods Concrete Methods
`void` `connectFailed(URI uri, SocketAddress sa, IOException ioe)` Notifies the active `ProxySelector` of a connection failure.
`List<Proxy>` `select(URI uri)` Selects a list of proxies for the given `URI` by delegating to the current `ProxySelector` or the next available `ProxySelector` in the list if the current one returns an empty proxy list.

### Methods inherited from class java.net.ProxySelector

`getDefault, setDefault`

### Methods inherited from class java.lang.Object

`clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

### Constructor Detail

#### DistributedProxySelector

    public DistributedProxySelector(List<ProxySelector> selectors)

Constructs a DistributedProxySelector with the given list of `ProxySelector`. The constructor initializes the currentSelector as a `ThreadLocal`, and the sharedIndex as an `AtomicInteger`.

Parameters:
  `selectors` - the list of ProxySelectors to use.
Throws:
  `IllegalArgumentException` - if the list is null or empty.

### Method Detail

#### select

    public List<Proxy> select(URI uri)

Selects a list of proxies for the given `URI` by delegating to the current `ProxySelector` or the next available `ProxySelector` in the list if the current one returns an empty proxy list. If an `Exception` occurs, it will be caught and ignored, and the next `ProxySelector` will be tried.

Specified by:
  `select` in class `ProxySelector`
Parameters:
  `uri` - the `URI` to select a proxy for.
Returns:
  a list of proxies for the given `URI`.

#### connectFailed

    public void connectFailed(URI uri,
                              SocketAddress sa,
                              IOException ioe)

Notifies the active `ProxySelector` of a connection failure. This method retrieves the current `ProxySelector` from the `ThreadLocal` variable and delegates the handling of the connection failure to the underlying ProxySelector's connectFailed() method. After handling the connection failure, the current ProxySelector is removed from the `ThreadLocal` variable.

Specified by:
  `connectFailed` in class `ProxySelector`
Parameters:
  `uri` - the `URI` that failed to connect.
  `sa` - the `SocketAddress` of the proxy that failed to connect.
  `ioe` - the `IOException` that resulted from the failed connection.