Class DistributedProxySelector


  • @Contract(threading=SAFE)
    public class DistributedProxySelector
    extends java.net.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
    • Field Summary

      Fields 
      Modifier and Type Field Description
      private java.lang.ThreadLocal<java.net.ProxySelector> currentSelector
      A ThreadLocal variable holding the current ProxySelector for each thread, ensuring thread safety when accessing the current ProxySelector.
      private static org.slf4j.Logger LOG  
      private java.util.List<java.net.ProxySelector> selectors
      A list of ProxySelector instances to be used by the DistributedProxySelector for selecting proxies.
      private java.util.concurrent.atomic.AtomicInteger sharedIndex
      An AtomicInteger representing the shared index across all threads for maintaining the current position in the list of ProxySelectors, ensuring proper distribution of ProxySelector usage.
    • Constructor Summary

      Constructors 
      Constructor Description
      DistributedProxySelector​(java.util.List<java.net.ProxySelector> selectors)
      Constructs a DistributedProxySelector with the given list of ProxySelector.
    • Method Summary

      All Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      void connectFailed​(java.net.URI uri, java.net.SocketAddress sa, java.io.IOException ioe)
      Notifies the active ProxySelector of a connection failure.
      private java.net.ProxySelector nextSelector()
      Retrieves the next available ProxySelector in the list of selectors, incrementing the shared index atomically to ensure proper distribution across different threads.
      java.util.List<java.net.Proxy> select​(java.net.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
    • Field Detail

      • LOG

        private static final org.slf4j.Logger LOG
      • selectors

        private final java.util.List<java.net.ProxySelector> selectors
        A list of ProxySelector instances to be used by the DistributedProxySelector for selecting proxies.
      • currentSelector

        private final java.lang.ThreadLocal<java.net.ProxySelector> currentSelector
        A ThreadLocal variable holding the current ProxySelector for each thread, ensuring thread safety when accessing the current ProxySelector.
      • sharedIndex

        private final java.util.concurrent.atomic.AtomicInteger sharedIndex
        An AtomicInteger representing the shared index across all threads for maintaining the current position in the list of ProxySelectors, ensuring proper distribution of ProxySelector usage.
    • Constructor Detail

      • DistributedProxySelector

        public DistributedProxySelector​(java.util.List<java.net.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:
        java.lang.IllegalArgumentException - if the list is null or empty.
    • Method Detail

      • select

        public java.util.List<java.net.Proxy> select​(java.net.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 java.net.ProxySelector
        Parameters:
        uri - the URI to select a proxy for.
        Returns:
        a list of proxies for the given URI.
      • connectFailed

        public void connectFailed​(java.net.URI uri,
                                  java.net.SocketAddress sa,
                                  java.io.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 java.net.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.
      • nextSelector

        private java.net.ProxySelector nextSelector()
        Retrieves the next available ProxySelector in the list of selectors, incrementing the shared index atomically to ensure proper distribution across different threads.
        Returns:
        the next ProxySelector in the list.