एक थ्रेड प्रॉक्सी प्रॉपर्टी सेट करता है, अनुरोध करता है और पुराना मान बहाल करता है। दूसरा थ्रेड किसी भिन्न प्रॉक्सी के साथ वही करता है। ऊपर से नीचे पढ़ने पर कोड साफ़ दिखता है, लेकिन दोनों थ्रेड साझा JVM स्थिति बदल रहे हैं।

System.setProperty() प्रक्रिया के लिए सिस्टम प्रॉपर्टी बदलता है। यह उस थ्रेड से मार्ग नहीं जोड़ता जिसने इसे कॉल किया। कोई समवर्ती अनुरोध किसी और के काम के लिए लिखा गया मान देख सकता है, और किसी मौजूदा क्लाइंट ने पहले ही अपना कॉन्फ़िगरेशन कैप्चर कर लिया हो सकता है।

मार्ग को क्लाइंट का हिस्सा बनाएं

Java के HTTP क्लाइंट के लिए, जानबूझकर चुने गए प्रॉक्सी सेलेक्टर वाले क्लाइंट बनाएं। जब कार्यभार को अलग रूटिंग नीतियों की आवश्यकता हो तो अलग क्लाइंट रखें:

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 के लिए एक ही प्रॉक्सी नीति उपयुक्त हो सकती है जब सभी भाग लेने वाले क्लाइंट को उसका पालन करना हो। एप्लिकेशन शुरू होने पर वह नीति सेट करें और जाँचें कि कौन-सी लाइब्रेरी उसका सम्मान करती हैं।

समस्याएँ तब उठती हैं जब वैश्विक प्रॉपर्टी का उपयोग व्यक्तिगत अनुरोधों के लिए अस्थायी स्विच के रूप में किया जाता है। सर्वर में, पृष्ठभूमि कार्यकर्ता और लाइब्रेरी कॉल समवर्ती रूप से चल सकते हैं, भले ही आपकी अपनी विधि सिंक्रोनस दिखे। रूटिंग स्थिति उस क्लाइंट या कनेक्टर के पास रखें जो कनेक्शन का स्वामी है, ताकि कोई अन्य अनुरोध काम के बीच में उसे न बदल सके।

संबंधित लेख