طلبات Java المتزامنة قد تتشارك إعدادات وكيل خاطئة
أبقِ طلبات Java المتزامنة على مساراتها المقصودة دون تبديل إعدادات وكيل JVM المشتركة.
خيط واحد يضبط خاصية وكيل، ويجري طلبًا، ثم يعيد القيمة القديمة. خيط آخر يفعل الشيء نفسه بوكيل مختلف. يبدو الكود مرتبًا عند قراءته من أعلى إلى أسفل، لكن كلا الخيطين يغيّران حالة JVM المشتركة.
System.setProperty() يغيّر خاصية نظام للعملية. ولا يربط مسارًا بالخيط الذي استدعاه. قد يرى طلب متزامن قيمة كُتبت لعمل شخص آخر، وقد يكون عميل قائم قد التقط بالفعل تهيئته الخاصة.
اجعل المسار جزءًا من العميل
بالنسبة لعميل HTTP في Java، أنشئ عملاء باستخدام محددات وكيل مقصودة. أبقِ عملاء منفصلين عندما تتطلب أحمال العمل سياسات توجيه مختلفة:
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. العنوان توضيحي؛ ولاختبارات المسارات العامة المسموح بها، توفر قائمة وكلاء HTTP نقاط نهاية مرشحة. اضبط مهلات الطلبات ومصادقة الوكيل بشكل منفصل وفقًا لاحتياجات التطبيق.
طريقة الوكيل في باني العميل تسجل اختيارًا على مستوى العميل. وهذا يجعل السياسة أسهل في الفحص من سلسلة كتابات عالمية ملفوفة حول عمليات غير متزامنة.
الإعدادات العالمية لا تزال مفيدة
قد تكون سياسة وكيل واحدة على مستوى JVM مناسبة عندما يُقصد أن يتبعها كل عميل مشارك. اضبط تلك السياسة عند بدء التطبيق وتحقق من المكتبات التي تحترمها.
تنشأ المشكلات عندما تُستخدم الخصائص العالمية كمفتاح مؤقت لطلبات فردية. في الخادم، قد تعمل العمال الخلفية واستدعاءات المكتبات في وقت واحد حتى لو بدت طريقتك متزامنة. أبقِ حالة التوجيه مع العميل أو الموصل الذي يملك الاتصال، حتى لا يستطيع طلب آخر تغييرها في منتصف العمل.