Cererile Java concurente pot partaja setările de proxy greșite
Aflați de ce modificarea unei proprietăți globale pentru fiecare cerere se scurge între fire și cum să păstrați politica de proxy la client.
Un fir setează o proprietate de proxy, face o cerere și restaurează valoarea veche. Alt fir face același lucru cu un proxy diferit. Codul arată îngrijit când este citit de sus în jos, dar ambele fire modifică starea JVM partajată.
System.setProperty() modifică o proprietate de sistem pentru proces. Nu atașează o rută firului care a apelat-o. O cerere concurentă poate vedea o valoare scrisă pentru munca altcuiva, iar un client existent poate să fi capturat deja propria configurație.
Faceți ruta parte din client
Pentru clientul HTTP al Java, creați clienți cu selectori de proxy intenționați. Păstrați clienți separați când sarcinile cer politici de rutare distincte:
HttpClient client = HttpClient.newBuilder()
.proxy(ProxySelector.of(
new InetSocketAddress("203.0.113.10", 8080)))
.connectTimeout(Duration.ofSeconds(5))
.build();Importurile sunt java.net, java.net.http și java.time. Adresa este ilustrativă; pentru teste permise pe rute publice, lista de proxy HTTP furnizează puncte finale candidate. Configurați termenele cererilor și autentificarea proxy separat, în funcție de nevoile aplicației.
Metoda proxy a constructorului înregistrează o alegere la nivel de client. Astfel politica este mai ușor de inspectat decât o succesiune de scrieri globale în jurul operațiilor asincrone.
Setările globale încă au rost
O singură politică de proxy pentru tot JVM-ul poate fi potrivită când fiecare client participant trebuie să o urmeze. Setați acea politică la pornirea aplicației și verificați ce biblioteci o respectă.
Problemele apar când proprietățile globale sunt folosite ca un comutator temporar pentru cereri individuale. Într-un server, lucrătorii din fundal și apelurile de bibliotecă pot rula concurent chiar dacă metoda dvs. pare sincronă. Păstrați starea de rutare la clientul sau conectorul care deține conexiunea, astfel încât o altă cerere să nu o poată schimba la mijlocul lucrului.