2016-11-30 13 views
10

जेट्टी 9.3क्या Jetty websocket क्लाइंट क्लास WebSocketClient थ्रेड सुरक्षित है?

जावा 8

org.eclipse.jetty.websocket.client.WebSocketClient धागा सुरक्षित है।

क्या एकाधिक धागे इस कक्षा के एक उदाहरण को वेबशॉट सत्र बनाने के लिए उपयोग कर सकते हैं (connect विधि के साथ)?

उत्तर

4

मैं गारंटी नहीं दे सकता कि WebSocketClient 100% धागा सुरक्षित है, लेकिन मैं कह सकता हूं कि यह कुछ हद तक थ्रेड सुरक्षित होना है।

source code को देखते हुए, हम देखते हैं कि निजी विधि initializeClient सिंक्रनाइज़ है:

private synchronized void initializeClient() throws IOException 

और उस connect विधि का उपयोग कर रहा है एक Executor:

// Execute the connection on the executor thread 
executor.execute(promise); 

वर्ग के प्रलेखन कुछ नहीं कहता है थ्रेड सुरक्षा के बारे में, लेकिन connect विधि से सिंक्रनाइज़ initializeClient विधि का कॉल और Executor का उपयोग स्पष्ट सिग है एनएस कि बहु-थ्रेडिंग का कुछ रूप समर्थित है।

== संपादित करें ==

थ्रेड सुरक्षा अक्सर ही आपरेशन के कुछ प्रकार के लिए गारंटी है। उदाहरण के लिए इसे केवल पढ़ने के संचालन के लिए गारंटी दी जा सकती है, न कि लेखन कार्यों के लिए। थ्रेड सुरक्षा की शर्तों को परिभाषित करने के लिए यह दस्तावेज़ीकरण की भूमिका है। सर्जीओ मोंटोरो की टिप्पणी सही है, अगर एक धागा किसी अन्य थ्रेड द्वारा इसके उपयोग के दौरान वस्तु को संशोधित करता है, तो अजीब चीजें हो सकती हैं। WebSocketClient के मामले में थ्रेड सुरक्षा निश्चित रूप से कम से कम अन्य धागे द्वारा ऑब्जेक्ट के गैर-संशोधन के लिए प्रतिबंधित है, या WebSocketClient आंतरिक स्थिति के सिंक्रनाइज़ और समेकित संशोधन के लिए।

+0

+1 वेबसाकेट क्लाइंट निश्चित रूप से थ्रेड-सुरक्षित होने के लिए लिखा गया है। तथ्य यह है कि _code में कभी-कभी bugs_ हो सकता है इसका मतलब यह नहीं है कि यह बहुप्रचारित कोड नहीं है। –

4

यह नहीं है the code यहां कम से कम एक उदाहरण क्यों है से:

WebSocketClient के प्रयोजन के दूरदराज के WebSocket अंतिम बिंदुओं को कनेक्शन स्थापित करने का मतलब है एक प्रदान करना है।

यह connect() विधि को कॉल करके हासिल किया जाता है, जो भविष्य सत्र देता है। ठीक है, अब कल्पना करो कि

  1. थ्रेड 1 को दर्शाता है एक WebSocketClient और कॉल setCookieStore()

  2. थ्रेड 1 कॉल connect(Object websocket, URI toUri)

  3. connect() थ्रेड 1 अंदर कार्यान्वित

    ClientUpgradeRequest request = new ClientUpgradeRequest(toUri) 
    

    और

    request.setRequestURI(toUri) 
    
  4. थ्रेड 2 कार्यान्वित setCookieStore(CookieStore cookieStore)

तब थ्रेड 1 के द्वारा बनाई गई अनुरोध करने के लिए इसी कुकीज़ हो सकता है थ्रेड के यूआरआई 2.

थ्रेड सुरक्षा सुनिश्चित करने के लिए ऑब्जेक्ट की आंतरिक स्थिति पूरी कनेक्शन प्रक्रिया के दौरान अपरिवर्तनीय होना चाहिए।

+0

सुनिश्चित नहीं है कि WebSocketClient में कुकी स्टोर सामान्य कुकी सेट करने के लिए यहां है जो विभिन्न कॉल के बीच साझा की जानी चाहिए। प्रति अनुरोध कुकी को ClientUpgradeRequest पर setCookies के साथ सेट किया जाना चाहिए। – benbenw

+0

यदि कुकीस्टोर को धागे में साझा किया जाना था तो इसे 'अस्थिर' घोषित किया जाना चाहिए। अन्यथा एक धागा मूल्य बदल सकता है और दूसरे को परिवर्तन नहीं दिखता है। साथ ही मैं वर्ग में कुकीज़ के दो सेट रखने के लिए कक्षा में नहीं देखता: थ्रेड्स सबसेट और प्रति-थ्रेड सबसेट के बीच साझा किया जाता है। इसके अलावा, क्या यह दो सबसेट में कुकीज़ को विभाजित करने के लिए उचित उपयोग केस के बारे में सोचना संभव है? –

संबंधित मुद्दे