Un thread imposta una proprietà proxy, effettua una richiesta e ripristina il vecchio valore. Un altro thread fa lo stesso con un proxy diverso. Il codice sembra ordinato letto dall'alto verso il basso, ma entrambi i thread stanno cambiando lo stato condiviso della JVM.

System.setProperty() cambia una proprietà di sistema per il processo. Non collega una rotta al thread che l'ha chiamato. Una richiesta concorrente può osservare un valore scritto per il lavoro di qualcun altro, e un client esistente potrebbe aver già acquisito la propria configurazione.

Rendi la rotta parte del client

Per il client HTTP di Java, crea client con selettori proxy deliberati. Mantieni client separati quando i carichi di lavoro richiedono politiche di instradamento diverse:

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

Gli import sono java.net, java.net.http e java.time. L'indirizzo è illustrativo; per test consentiti di rotte pubbliche, la lista di proxy HTTP fornisce endpoint candidati. Configura le scadenze delle richieste e l'autenticazione proxy separatamente in base alle esigenze dell'applicazione.

Il metodo proxy del builder registra una scelta a livello di client. Questo rende la politica più facile da ispezionare rispetto a una sequenza di scritture globali avvolte attorno a operazioni asincrone.

Le impostazioni globali hanno ancora un uso

Una singola politica proxy per tutta la JVM può essere appropriata quando tutti i client partecipanti devono seguirla. Imposta quella politica all'avvio dell'applicazione e verifica quali librerie la rispettano.

I problemi sorgono quando le proprietà globali vengono usate come interruttore temporaneo per singole richieste. In un server, i worker in background e le chiamate di libreria possono essere eseguiti contemporaneamente anche se il tuo metodo sembra sincrono. Mantieni lo stato di instradamento presso il client o il connettore che possiede la connessione, così un'altra richiesta non può cambiarlo a metà del lavoro.

Articoli correlati