Un hilo establece una propiedad de proxy, realiza una solicitud y restaura el valor anterior. Otro hilo hace lo mismo con un proxy distinto. El código parece ordenado al leerlo de arriba abajo, pero ambos hilos están cambiando estado compartido de la JVM.

System.setProperty() cambia una propiedad del sistema para el proceso. No adjunta una ruta al hilo que lo llamó. Una solicitud concurrente puede observar un valor escrito para el trabajo de otra persona, y un cliente existente puede haber capturado ya su propia configuración.

Haga que la ruta forme parte del cliente

Para el cliente HTTP de Java, cree clientes con selectores de proxy deliberados. Mantenga clientes separados cuando las cargas de trabajo requieran políticas de enrutamiento distintas:

HttpClient client = HttpClient.newBuilder()
    .proxy(ProxySelector.of(
        new InetSocketAddress("203.0.113.10", 8080)))
    .connectTimeout(Duration.ofSeconds(5))
    .build();

Las importaciones son java.net, java.net.http y java.time. La dirección es ilustrativa; para pruebas permitidas de rutas públicas, la lista de proxies HTTP proporciona puntos finales candidatos. Configure los plazos de las solicitudes y la autenticación del proxy por separado según las necesidades de la aplicación.

El método proxy del constructor registra una elección a nivel de cliente. Eso hace que la política sea más fácil de inspeccionar que una secuencia de escrituras globales envueltas alrededor de operaciones asíncronas.

Los ajustes globales aún tienen utilidad

Una única política de proxy para toda la JVM puede ser adecuada cuando todos los clientes participantes deben seguirla. Establezca esa política al iniciar la aplicación y verifique qué bibliotecas la respetan.

Los problemas surgen cuando las propiedades globales se usan como un interruptor temporal para solicitudes individuales. En un servidor, los trabajadores en segundo plano y las llamadas de biblioteca pueden ejecutarse de forma concurrente aunque su propio método parezca síncrono. Mantenga el estado de enrutamiento con el cliente o conector que posee la conexión, para que otra solicitud no pueda cambiarlo a mitad del trabajo.

Artículos relacionados