Ein Thread setzt eine Proxy-Eigenschaft, stellt eine Anfrage und stellt den alten Wert wieder her. Ein anderer Thread tut dasselbe mit einem anderen Proxy. Der Code wirkt beim Lesen von oben nach unten ordentlich, aber beide Threads verändern gemeinsamen JVM-Zustand.

System.setProperty() ändert eine Systemeigenschaft für den Prozess. Es hängt keine Route an den Thread, der es aufgerufen hat. Eine gleichzeitige Anfrage kann einen Wert sehen, der für die Arbeit eines anderen geschrieben wurde, und ein bestehender Client hat möglicherweise bereits seine eigene Konfiguration erfasst.

Machen Sie die Route zum Teil des Clients

Erstellen Sie für Javas HTTP-Client Clients mit bewussten Proxy-Selektoren. Halten Sie Clients getrennt, wenn Arbeitslasten unterschiedliche Routing-Richtlinien erfordern:

HttpClient client = HttpClient.newBuilder()
    .proxy(ProxySelector.of(
        new InetSocketAddress("203.0.113.10", 8080)))
    .connectTimeout(Duration.ofSeconds(5))
    .build();

Die Importe sind java.net, java.net.http und java.time. Die Adresse ist beispielhaft; für zulässige Tests öffentlicher Routen liefert die HTTP-Proxy-Liste Kandidaten-Endpunkte. Konfigurieren Sie Anfragefristen und Proxy-Authentifizierung getrennt nach den Anforderungen der Anwendung.

Die Proxy-Methode des Builders zeichnet eine Wahl auf Client-Ebene auf. Das macht die Richtlinie leichter überprüfbar als eine Folge globaler Schreibvorgänge, die um asynchrone Vorgänge gelegt sind.

Globale Einstellungen haben noch einen Nutzen

Eine einzige JVM-weite Proxy-Richtlinie kann angemessen sein, wenn alle beteiligten Clients sie befolgen sollen. Legen Sie diese Richtlinie beim Anwendungsstart fest und prüfen Sie, welche Bibliotheken sie beachten.

Probleme entstehen, wenn globale Eigenschaften als vorübergehender Schalter für einzelne Anfragen verwendet werden. In einem Server können Hintergrund-Worker und Bibliotheksaufrufe gleichzeitig laufen, auch wenn Ihre eigene Methode synchron erscheint. Halten Sie den Routing-Zustand beim Client oder Connector, dem die Verbindung gehört, damit eine andere Anfrage ihn nicht mitten in der Aufgabe ändern kann.

Ähnliche Artikel