Równoległe żądania Java mogą współdzielić niewłaściwe ustawienia proxy
Zobacz, dlaczego zmiana właściwości globalnej przy każdym żądaniu przecieka między wątkami i jak utrzymać politykę proxy po stronie klienta.
Jeden wątek ustawia właściwość proxy, wysyła żądanie i przywraca poprzednią wartość. Inny wątek robi to samo z innym proxy. Kod wygląda schludnie, gdy czyta się go z góry na dół, ale oba wątki zmieniają współdzielony stan JVM.
System.setProperty() zmienia właściwość systemową procesu. Nie przypisuje trasy do wątku, który ją wywołał. Równoległe żądanie może zobaczyć wartość zapisaną dla cudzej pracy, a istniejący klient mógł już przechwycić własną konfigurację.
Uczyń trasę częścią klienta
Dla klienta HTTP Javy twórz klientów z celowymi selektorami proxy. Utrzymuj osobne klienty, gdy obciążenia wymagają różnych polityk routingu:
HttpClient client = HttpClient.newBuilder()
.proxy(ProxySelector.of(
new InetSocketAddress("203.0.113.10", 8080)))
.connectTimeout(Duration.ofSeconds(5))
.build();Importy to java.net, java.net.http i java.time. Adres jest przykładowy; do dozwolonych testów tras publicznych lista proxy HTTP dostarcza kandydujące punkty końcowe. Skonfiguruj terminy żądań i uwierzytelnianie proxy osobno, zgodnie z potrzebami aplikacji.
Metoda proxy konstruktora zapisuje wybór na poziomie klienta. Dzięki temu politykę łatwiej sprawdzić niż sekwencję globalnych zapisów otaczających operacje asynchroniczne.
Ustawienia globalne nadal mają zastosowanie
Jedna polityka proxy dla całej JVM może być odpowiednia, gdy każdy uczestniczący klient ma jej przestrzegać. Ustaw tę politykę przy starcie aplikacji i sprawdź, które biblioteki ją respektują.
Problemy pojawiają się, gdy właściwości globalne służą jako tymczasowy przełącznik dla pojedynczych żądań. W serwerze procesy robocze w tle i wywołania bibliotek mogą działać równolegle, nawet jeśli twoja metoda wygląda synchronicznie. Trzymaj stan routingu przy kliencie lub konektorze, który jest właścicielem połączenia, aby inne żądanie nie mogło go zmienić w połowie pracy.