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.

Související články