Satu utas menetapkan properti proxy, membuat permintaan, dan memulihkan nilai lama. Utas lain melakukan hal yang sama dengan proxy berbeda. Kode terlihat rapi saat dibaca dari atas ke bawah, tetapi kedua utas mengubah status JVM yang dibagikan.

System.setProperty() mengubah properti sistem untuk proses. Itu tidak melampirkan rute ke utas yang memanggilnya. Permintaan bersamaan dapat melihat nilai yang ditulis untuk pekerjaan orang lain, dan klien yang ada mungkin sudah menangkap konfigurasinya sendiri.

Jadikan rute bagian dari klien

Untuk klien HTTP Java, buat klien dengan pemilih proxy yang disengaja. Pertahankan klien terpisah saat beban kerja memerlukan kebijakan perutean berbeda:

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

Impornya adalah java.net, java.net.http, dan java.time. Alamat tersebut ilustratif; untuk pengujian rute publik yang diizinkan, daftar proxy HTTP menyediakan endpoint kandidat. Konfigurasikan tenggat waktu permintaan dan autentikasi proxy secara terpisah sesuai kebutuhan aplikasi.

Metode proxy pada builder mencatat pilihan di tingkat klien. Itu membuat kebijakan lebih mudah diperiksa daripada rangkaian penulisan global yang membungkus operasi asinkron.

Pengaturan global masih berguna

Satu kebijakan proxy untuk seluruh JVM bisa sesuai ketika setiap klien yang berpartisipasi dimaksudkan untuk mengikutinya. Tetapkan kebijakan itu saat aplikasi dimulai dan verifikasi pustaka mana yang mematuhinya.

Masalah muncul ketika properti global digunakan sebagai sakelar sementara untuk permintaan individual. Di server, pekerja latar belakang dan panggilan pustaka dapat berjalan bersamaan meskipun metode Anda sendiri tampak sinkron. Simpan status perutean pada klien atau konektor yang memiliki koneksi, sehingga permintaan lain tidak dapat mengubahnya di tengah pekerjaan.

Artikel terkait