2010-08-26 10 views
7

कैसे बना सकता हूं मैं एक थ्रेड सुरक्षित जेएसपी पेज बनाना चाहता हूं। सिंगल थ्रेड मॉडेल इंटरफेस को कार्यान्वित करके सर्वलेट में संभव है लेकिन मुझे नहीं पता कि जेएसपी पेज में इसे कैसे किया जाए।मैं थ्रेड सुरक्षित जेएसपी पेज

+2

आपको नहीं करना चाहिए। ऐसा करने का मतलब है कि आपका डिज़ाइन पूरी तरह से त्रुटिपूर्ण है। जब आप वास्तविक व्यापारिक दुनिया में ऐसा कर रहे हों तो आपको विस्मरण में निकाल दिया जाएगा। यह भी देखें [Servlets और Threadsafety] (http://stackoverflow.com/questions/3106909) और [जेएसपी में जावा कोड से कैसे बचें] (http://stackoverflow.com/questions/3177733)। – BalusC

उत्तर

9

सैद्धांतिक रूप से, जेएसपी पृष्ठों को isThreadSafe पृष्ठ निर्देशक विशेषता के माध्यम से थ्रेडसेफ के रूप में इंगित किया जा सकता है। झूठी मान निर्धारित करना, कंटेनर को पेज लेवल ऑब्जेक्ट्स तक पहुंच सिंक्रनाइज़ करने के लिए मिलेगा (और सत्र और एप्लिकेशन स्कोप्ड ऑब्जेक्ट्स या किसी अन्य किस्म की ऑब्जेक्ट्स के लिए नहीं)। जाहिर है, यह अभी भी डेवलपर की ज़िम्मेदारी है ताकि यह सुनिश्चित किया जा सके कि कोड के थ्रेड असुरक्षित क्षेत्रों में सिंक्रोनस पहुंच हो।

मोरवोवर, सिंगल थ्रेड मॉडेल इंटरफ़ेस को सर्वलेट विशिष्टता रिलीज 2.4 में भी बहिष्कृत कर दिया गया है। सिंगल थ्रेड मॉडेल इंटरफ़ेस का उपयोग जेएसपी में अनुमानित थ्रेड सुरक्षा को लागू करने के लिए किया जाता है, साथ ही जेनरेट किए गए सर्वलेट कक्षाएं जेएसपी के लिए सिंगल थ्रेड मॉडेल को लागू करती हैं जो थ्रेडसेफ विशेषता का उपयोग करती है। विनिर्देश खुद की रूपरेखा क्यों इंटरफेस अब मान्य नहीं है:

SRV.2.2.1 नोट के बारे में एकल थ्रेड मॉडल

SingleThreadModel इंटरफेस की गारंटी देता है के उपयोग है कि एक समय में केवल एक धागा होगा में दिए गए सर्वलेट इंस्टेंस की सेवा विधि में निष्पादित करें। यह ध्यान रखना महत्वपूर्ण है कि यह गारंटी केवल प्रत्येक सर्वलेट उदाहरण पर लागू होती है, क्योंकि कंटेनर ऐसी ऑब्जेक्ट्स को पूल करना चुन सकता है। ऐसे HttpSession के उदाहरण के रूप में वस्तुओं, कि एक समय में अधिक एक से सर्वलेट उदाहरण के लिए उपलब्ध हैं, उन कि SingleThreadModel लागू सहित कई servlets, करने के लिए किसी विशेष समय पर उपलब्ध हो सकता है।

यह अनुशंसित है कि एक डेवलपर बजाय इस तरह के उपयोग एक उदाहरण चर के या कोड उन संसाधनों तक पहुँचने का ब्लॉक सिंक्रनाइज़ करने से परहेज के रूप में इस इंटरफेस को लागू करने, उन लोगों के मुद्दों को हल करने अन्य साधनों से लेते हैं। सिंगल थ्रेड मॉडेल इंटरफेस विनिर्देश के इस संस्करण में बहिष्कृत है।

+0

मैंने सोचा था कि सिंगल थ्रेड मॉडेल को 2.5 spec में बहिष्कृत किया गया था। – naikus

0

आप नहीं करते हैं।

जेएसपी मूल रूप से सर्वलेट में एक विधि है। जैसा कि आप पहले से ही जानते हैं, विधियां सुरक्षित हैं, अर्थ यह है कि एक ही ऑब्जेक्ट की एक ही विधि को उसी समय एक ही विधि का आह्वान करने वाले दो थ्रेड, प्रत्येक को अपने स्वयं के ढेर में निष्पादित करेंगे।

तो, आपको वास्तव में थ्रेड सुरक्षित जेएसपी बनाने की ज़रूरत नहीं है, क्योंकि यह पहले से ही व्यापार सुरक्षित है।

यदि आप एक जेएसपी में एक चर a घोषित करते हैं, तो कोई दूसरा तरीका नहीं है, एक और अनुरोध उस चर को देखता है।

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

+1

सं।आपका जेएसपी कोड को कॉल कर सकता है जो थ्रेड सुरक्षित नहीं हो सकता है। – djna

+0

@djna: +1 हाँ, यही मेरा कहना है। जेएसपी इसे स्वयं सिंक्रनाइज़ेशन की आवश्यकता नहीं है, लेकिन आप जिस ऑब्जेक्ट में इसका उपयोग करते हैं। मैं इसे जोर देने के लिए संक्षेप में लालसा बदलता हूं। – OscarRyz

1

जेएसपी के साथ थ्रेड-सुरक्षा के बारे में बात करना गलत है - जेएसपी एक दृश्य तकनीक है और यह केवल परिणाम प्रदर्शित करती है - यह कोई प्रसंस्करण नहीं करती है। (यह प्रसंस्करण कर सकते हैं, लेकिन यह नहीं करना चाहिए) सर्वलेट्स साथ

थ्रेड-सुरक्षा सर्वलेट में कोई निजी क्षेत्रों होने से हासिल की है - सर्वलेट उदाहरण पूरे कंटेनर के लिए एक है और प्रत्येक अनुरोध एक नया है धागा service(..) विधि का आह्वान करता है।

आपको अपने मामले में "थ्रेड-सुरक्षा" से सटीक रूप से निर्दिष्ट करना चाहिए - यानी आप असफल होने की क्या अपेक्षा करते हैं।

+0

क्षमा करें, यह सही नहीं है। एक जेएसपी (यह नहीं होना चाहिए) मनमाना जावा होना चाहिए, जो थ्रेड सुरक्षित नहीं हो सकता है। – djna

+0

बेशक, लेकिन यह नहीं होना चाहिए। इसके बारे में एक स्पष्टीकरण जोड़ा गया। – Bozho

3

अपने जेएसपी पृष्ठ में कोई राज्य जानकारी नहीं रखते हैं। (कोई आवृत्ति चर नहीं है, जो विभिन्न अनुरोधों में बदल सकता है)। आप अपने JSP या सर्वलेट में किसी भी राज्य की जरूरत नहीं है, तो वे threadsafe

5

पहले संक्षिप्त उत्तर <% @ page हैं isThreadSafe = "false"%>

अब जवाब है कि ऐसा नहीं करते है।

आपको यहां अपने उद्देश्य के बारे में बहुत स्पष्ट होना चाहिए। आपने सिंगल थ्रेड मॉडेल का उपयोग करके वास्तव में थ्रेड-सुरक्षित नहीं बनाया है, बल्कि आपने चीजों को सेट अप किया है ताकि एक समय में केवल एक थ्रेड आपके सर्वलेट में जा सके। संभवतः आप ऐसा कर रहे होंगे क्योंकि सर्वलेट कोड थ्रेड सुरक्षित नहीं है, यह है कि यदि कोड पर एक से अधिक थ्रेड प्राप्त होते हैं तो बुरी चीजें होती हैं।

यह मेरे लिए अर्थ है आप सर्वलेट कोड में कुछ इस तरह है:

doGet(/*etc/*){ 

     // ... stuff 

      someExistingUnsafeClass.doSomething(); 

     // .. more stuff 

    } 

सब के बाद, अपने serlvet कोड में ही नहीं धागा असुरक्षित, निश्चित रूप से हो सकता है? आप इसे ठीक करेंगे, है ना? तो यह कुछ विरासत कोड होना चाहिए जो थ्रेड-असुरक्षित है?

यदि यह अपने JSP के साथ परिदृश्य, अपने JSP में कहीं आप एक कॉल कि असुरक्षित सामान है कि मौजूदा विरासत कोड का उपयोग करने, की आवश्यकता होगी, है:

<% 
     someExistingUnsafeClass.doSomething(); 
%> 

तो आप बस इस असुरक्षित कॉल की रक्षा के लिए की जरूरत है:

<% 
    synchronized(this){ 
     someExistingUnsafeClass.doSomething(); 

    }; 
%> 

आपके जेएसपी के बड़े पैमाने पर ठीक से चलने के लिए अनुमति देने से बहुत बेहतर प्रदर्शन होगा।

मुझे यह भी कहना चाहिए कि यदि आप एमवीसी के रूप में अपना आवेदन तैयार करते हैं तो सभी थ्रेड-असुरक्षित कोड नियंत्रक से कहा जाता है और दृश्य (जेएसपी) को कभी भी असुरक्षित होने की आवश्यकता नहीं होती है।

1

जेएसपी में, केवल स्क्रिप्लेट में चर का उपयोग करें और आप भरोसा कर सकते हैं कि वे थ्रेड सुरक्षित हैं क्योंकि उन्हें service() में स्थानीय चर में अनुवादित किया जाएगा।

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