Samtidige Java-førespurnader kan dela feil proxyinnstillingar
Sjå kvifor ein global eigenskap per førespurnad lek mellom trådar, og korleis du held proxy-policyen på klienten.
Éin tråd set ein proxy-eigenskap, sender ein førespurnad og gjenopprettar den gamle verdien. Ein annan tråd gjer det same med ein annan proxy. Koden ser ryddig ut når han blir lesen ovanfrå og ned, men begge trådane endrar delt JVM-tilstand.
System.setProperty() endrar ein systemeigenskap for prosessen. Det knyter ikkje ei rute til tråden som kalla det. Ein samtidig førespurnad kan sjå ein verdi som er skriven for andres arbeid, og ein eksisterande klient kan allereie ha fanga opp si eiga konfigurasjon.
Gjer ruta til ein del av klienten
For Java sin HTTP-klient, opprett klientar med medvitne proxy-veljarar. Hald separate klientar når arbeidsmengder krev ulike rutingspolicyar:
HttpClient client = HttpClient.newBuilder()
.proxy(ProxySelector.of(
new InetSocketAddress("203.0.113.10", 8080)))
.connectTimeout(Duration.ofSeconds(5))
.build();Importane er java.net, java.net.http og java.time. Adressa er illustrativ; for tillatne offentlege rute-testar leverer HTTP-proxylista kandidat-endepunkt. Konfigurer førespurnadsfristar og proxy-autentisering separat etter behova til applikasjonen.
Byggjaren sin proxy-metode registrerer eit val på klientnivå. Det gjer policyen enklare å inspisere enn ein sekvens av globale skrivingar rundt asynkrone operasjonar.
Globale innstillingar har framleis nytte
Éin proxy-policy for heile JVM-en kan vere høveleg når kvar deltakande klient er meint å følgje han. Set den policyen ved oppstart av applikasjonen og verifiser kva bibliotek som respekterer han.
Problem oppstår når globale eigenskapar blir brukte som ein mellombels brytar for enkelte førespurnader. I ein server kan bakgrunnsarbeidarar og bibliotekkall køyre samtidig sjølv om metoden din ser synkron ut. Hald rutetilstanden hjå klienten eller koplinga som eig sambandet, slik at ein annan førespurnad ikkje kan endre han midt i jobben.