2008-10-07 15 views
72

सर्वलेट की मेरी समझ में, सर्वलेट को कंटेनर द्वारा तुरंत चालू किया जाएगा, इसकी init() विधि एक बार कॉल की जाएगी, और जब तक JVM बंद नहीं हो जाता तब तक सर्वलेट एक सिंगलटन की तरह लाइव रहेगा।HttpServlet Serializable लागू क्यों करता है?

मुझे उम्मीद नहीं है कि मेरे सर्वलेट को क्रमबद्ध किया जाए, क्योंकि ऐप सर्वर ठीक होने पर या सामान्य रूप से शुरू होने पर इसे नया बनाया जाएगा। सर्वलेट में कोई सत्र-विशिष्ट सदस्य नहीं होना चाहिए, इसलिए यह डिस्क पर लिखे जाने और पुन: तत्काल करने के लिए समझ में नहीं आता है। क्या इसके लिए कोई व्यावहारिक उपयोग है?

मेरी चिंताएं हैं कि मैंने वहां कुछ गैर-धारावाहिक फ़ील्ड लगाए हैं और फिर मेरा ऐप एक उत्पादन वातावरण में रहस्यमय रूप से असफल हो जाएगा जहां एक अलग प्रकार की सत्र प्रतिकृति होगी।

+0

समान: [WebApplication में क्रमबद्धता का उद्देश्य] (https://stackoverflow.com/q/1746550/642706) –

उत्तर

56

तकनीकी रूप से, मेरा मानना ​​है कि सर्वलेट कंटेनर को सर्वलेट ऑब्जेक्ट को डिस्क पर "निष्क्रिय" करने की अनुमति है, इसी प्रकार ईजेबी सत्र बीन्स हो सकता है। इसलिए यदि आप गैर-धारावाहिक फ़ील्ड के कारण आपका ऐप विफल हो जाएंगे तो सवाल पूछने के लिए सही हैं।

प्रैक्टिस में, मैंने कभी ऐसा करने वाला कंटेनर नहीं सुना है, इसलिए यह वास्तव में जे 2 ईई के बुरे पुराने दिनों से केवल विरासत सामान है। मैं इसके बारे में चिंता नहीं करता।

+1

लेकिन जो, passivate एक सर्वलेट की जरूरत है जब यह धागा सुरक्षित होगा, और कोई बातचीत राज्य है ? –

+1

ऐसा इसलिए है कि क्लस्टर सर्वर विफल न हों और मानचित्र सत्र में विफल होने पर एक समान बग इसे सत्यापित करता है, https://issues.apache.org/bugzilla/show_bug.cgi?id=30809 – dev

+2

@dev बग है गैर-क्रमिक सत्र विशेषताओं के बारे में, servlets के किसी भी serialization के बारे में नहीं। –

1

Google ऐसा सुझाव देता है कि ऐसा किया गया था ताकि कंटेनर लेखकों के पास विकल्प हो, यदि वे चाहते हैं।

आप सही हैं कि सर्वलेट में कोई सत्र-विशिष्ट सदस्य नहीं होना चाहिए, वास्तव में मुझे लगता है कि आप जितना संभव हो उतना छोटा राज्य चाहते हैं। यदि आप सब कुछ सत्र या ServletConfig में स्टोर करते हैं, तो मुझे लगता है कि आप क्रमबद्धता से बचने में सक्षम होंगे।

+2

अच्छी तरह से सत्र सर्वलेट की तुलना में क्रमबद्ध होने की संभावना अधिक है, इसलिए इसे संग्रहीत करने से समस्या कम नहीं होगी। – skaffman

+1

@matt b: चिंता इतनी अधिक सत्र-विशिष्ट स्थिति नहीं है क्योंकि सर्वलेट की निर्भरताएं (जैसे सेवा परत ऑब्जेक्ट्स) –

0

बस ऑब्जेक्ट्स की तरह सत्र ऑब्जेक्ट्स को क्लस्टर विकल्प देने वाले उन सर्वलेट कंटेनर के लिए कैश जीवित रहने के लिए क्रमबद्ध किया जाता है, तो एक कंटेनर के लिए एक सर्वलेट उदाहरण के साथ-साथ अन्य क्लस्टर नोड को स्थानांतरित करने का विकल्प भी हो सकता है ?? मैं बस अनुमान लगा रहा हूं

10

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

+0

क्या जेएनडीआई उन फ़ील्ड को सेट करने का एकमात्र सही तरीका है जो धारावाहिक नहीं हैं? यह बहुत भयानक है। :( – Trejkaz

-3

सीरियलज़ेबल को वितरित वातावरण में सत्र के गुणों के लिए मार्कर इंटरफ़ेस के रूप में उपयोग किया जाता है।

SRV.7.7.2 वितरित वातावरण (JSR-154)

एक आवेदन के रूप में वितरण योग्य चिह्नित के भीतर, सभी अनुरोधों कि हैं एक सत्र के हिस्से के एक जावा वर्चुअल द्वारा नियंत्रित किया जाना चाहिए एक समय में मशीन ("JVM")। कंटेनर सेट ऑब्जेक्ट का उपयोग करके HttpSession क्लास के उदाहरणों में रखे गए सभी ऑब्जेक्ट को संभालने में सक्षम होना चाहिए या उचित तरीके से वैल्यू विधियां डालना चाहिए। निम्न प्रतिबंध इन शर्तों को पूरा करने के लिए लगाया जाता है:

  • कंटेनर वस्तुओं कि Serializable इंटरफ़ेस लागू स्वीकार करना चाहिए।
  • सत्रों का प्रवास कंटेनर-विशिष्ट सुविधाओं द्वारा संभाला जाएगा।

वितरित सर्वलेट कंटेनर जहां कंटेनर तंत्र सत्र को ले जाने का आवश्यक उन्हें भंडारण का समर्थन नहीं कर सकते हैं वस्तुओं के लिए एक IllegalArgumentException फेंक चाहिए।

वितरित सर्वलेट कंटेनर पलायन ऑब्जेक्ट को लागू Serializable के लिए तंत्र आवश्यक समर्थन करना चाहिए।

(...)

कंटेनर प्रदाता एक सत्र वस्तु को स्थानांतरित करने की क्षमता है, और उसकी सामग्री, किसी भी सक्रिय से होने scalability और सेवा की गुणवत्ता में लोड संतुलन और विफलता की तरह सुविधाओं सुनिश्चित कर सकते हैं द्वारा सिस्टम के एक अलग नोड को वितरित सिस्टम का नोड। वितरित कंटेनर जारी रहती है या विस्थापित सत्र सेवा सुविधाओं की गुणवत्ता प्रदान करने के लिए, वे HttpSessions और उनके विशेषताओं serializing के लिए देशी JVM क्रमबद्धता प्रणाली का उपयोग करने के लिए ही सीमित नहीं हैं हैं। डेवलपर्स की गारंटी नहीं है कि कंटेनर कॉल ऑब्जेक्ट्स पर readObject और writeObject विधियों को कॉल करेंगे, यदि वे उन्हें लागू करते हैं, लेकिन गारंटी है कि के सीरियलज़ेबल बंद होने पर उनके गुण संरक्षित किए जाएंगे।

+3

यह एक भ्रामक उत्तर है। सर्वलेट उदाहरण आमतौर पर सत्र में संग्रहीत नहीं होता है। – BalusC

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