Souběžné požadavky v Javě mohou sdílet špatné nastavení proxy
Udržte souběžné požadavky Java na zamýšlených trasách bez přepínání sdíleného nastavení proxy v JVM.
Jedno vlákno nastaví vlastnost proxy, odešle požadavek a obnoví starou hodnotu. Jiné vlákno udělá totéž s jinou proxy. Kód vypadá uklizeně při čtení shora dolů, ale obě vlákna mění sdílený stav JVM.
System.setProperty() mění systémovou vlastnost pro proces. Nepřipojuje trasu k vláknu, které ji zavolalo. Souběžný požadavek může vidět hodnotu zapsanou pro práci někoho jiného a existující klient už mohl zachytit vlastní konfiguraci.
Udělejte z trasy součást klienta
Pro HTTP klienta Javy vytvářejte klienty s záměrnými selektory proxy. Ponechte oddělené klienty, když pracovní zátěže vyžadují odlišné politiky směrování:
HttpClient client = HttpClient.newBuilder()
.proxy(ProxySelector.of(
new InetSocketAddress("203.0.113.10", 8080)))
.connectTimeout(Duration.ofSeconds(5))
.build();
Importy jsou java.net, java.net.http a java.time. Adresa je ilustrativní; pro povolené testy veřejných tras dodává seznam HTTP proxy kandidátní koncové body. Lhůty požadavků a ověřování proxy nakonfigurujte zvlášť podle potřeb aplikace.
Metoda proxy v builderu zaznamenává volbu na úrovni klienta. To činí politiku snáze kontrolovatelnou než sled globálních zápisů obalených kolem asynchronních operací.
Globální nastavení má stále využití
Jediná politika proxy pro celou JVM může být vhodná, když ji mají dodržovat všichni zúčastnění klienti. Nastavte ji při startu aplikace a ověřte, které knihovny ji respektují.
Problémy vznikají, když se globální vlastnosti používají jako dočasný přepínač pro jednotlivé požadavky. Na serveru mohou pracovníci na pozadí a volání knihoven běžet souběžně, i když vaše metoda vypadá synchronně. Uchovávejte stav směrování u klienta nebo konektoru, který vlastní připojení, aby ho jiný požadavek nemohl změnit v polovině práce.