คำขอ Java พร้อมกันอาจใช้การตั้งค่า proxy ผิดร่วมกัน
รักษาคำขอ Java พร้อมกันให้อยู่บนเส้นทางที่ตั้งใจโดยไม่สลับการตั้งค่า proxy ของ JVM ที่ใช้ร่วมกัน
เธรดหนึ่งตั้งค่าคุณสมบัติ proxy ส่งคำขอ แล้วคืนค่าเดิม อีกเธรดทำเช่นเดียวกันกับ proxy อื่น โค้ดดูเรียบร้อยเมื่ออ่านจากบนลงล่าง แต่ทั้งสองเธรดกำลังเปลี่ยนสถานะ JVM ที่ใช้ร่วมกัน
System.setProperty() เปลี่ยนคุณสมบัติระบบสำหรับโปรเซส ไม่ได้ผูกเส้นทางกับเธรดที่เรียกใช้ คำขอที่ทำงานพร้อมกันอาจเห็นค่าที่เขียนไว้สำหรับงานของคนอื่น และไคลเอนต์ที่มีอยู่แล้วอาจบันทึกการกำหนดค่าของตนเองไปแล้ว
ทำให้เส้นทางเป็นส่วนหนึ่งของไคลเอนต์
สำหรับไคลเอนต์ HTTP ของ Java ให้สร้างไคลเอนต์ด้วยตัวเลือก proxy ที่ตั้งใจ เก็บไคลเอนต์แยกกันเมื่อภาระงานต้องการนโยบายเส้นทางที่ต่างกัน:
HttpClient client = HttpClient.newBuilder()
.proxy(ProxySelector.of(
new InetSocketAddress("203.0.113.10", 8080)))
.connectTimeout(Duration.ofSeconds(5))
.build();
อิมพอร์ตคือ java.net, java.net.http และ java.time ที่อยู่เป็นเพียงตัวอย่าง สำหรับการทดสอบเส้นทางสาธารณะที่ได้รับอนุญาต รายการ proxy HTTP มีปลายทางที่เป็นไปได้ กำหนดเส้นตายของคำขอและการพิสูจน์ตัวตน proxyแยกตามความต้องการของแอปพลิเคชัน
เมธอด proxy ของ builder บันทึกตัวเลือกในระดับไคลเอนต์ ทำให้ตรวจสอบนโยบายได้ง่ายกว่าลำดับการเขียนระดับโลกที่ห่อรอบการทำงานแบบอะซิงโครนัส
การตั้งค่าระดับโลกยังมีประโยชน์
นโยบาย proxy เดียวสำหรับทั้ง JVM อาจเหมาะสมเมื่อไคลเอนต์ที่เข้าร่วมทุกตัวตั้งใจให้ปฏิบัติตาม ตั้งนโยบายนั้นเมื่อเริ่มแอปพลิเคชันและตรวจสอบว่าไลบรารีใดปฏิบัติตาม
ปัญหาเกิดขึ้นเมื่อคุณสมบัติระดับโลกถูกใช้เป็นสวิตช์ชั่วคราวสำหรับคำขอแต่ละรายการ ในเซิร์ฟเวอร์ ผู้ปฏิบัติงานเบื้องหลังและการเรียกไลบรารีอาจทำงานพร้อมกันแม้เมธอดของคุณดูเป็นแบบซิงโครนัส เก็บสถานะเส้นทางไว้กับไคลเอนต์หรือตัวเชื่อมต่อที่เป็นเจ้าของการเชื่อมต่อ เพื่อให้คำขออื่นเปลี่ยนไม่ได้กลางงาน