2012-01-31 2 views
6

मुझे पता था कि स्टेटफुल सेम, विभिन्न उदाहरण विधि कॉल के बीच बातचीत के सत्र, लेकिन राज्यविहीन इच्छा not.My सवाल बनाए रखने के मान मैं की तरहअंतर

नीचे
import javax.ejb.Stateful; 
import javax.ejb.Stateless; 

import com.tata.ejb3.data.HelloEJBInterface; 

@Stateless 
public class ValueEJB implements ValueEJBInterface{ 

    private int value; 
    @Override 
    public int getValue() { 
     return this.value; 
    } 

    @Override 
    public void setValue(int value) { 
     this.value = value; 
    } 
} 

मैं एक राज्यविहीन सेम कार्यान्वयन है मेरी सेम ग्राहक (ए सर्वलेट) जो

@EJB(mappedName="E/ValueEJB /remote") 
ValueEJBInterface value; 

.... 

value.setValue(250); 
System.out.println(value.getValue());//This statement prints the value 250 

.... 

नीचे के रूप में सेम मंगलाचरण शुरू की मेरी सेम के रूप में मेरी समझ के अनुसार राज्यविहीन सेम यह मूल्य के साथ प्रदर्शित नहीं करना चाहिए है 250.

012,

निजी int मूल्य; एक तत्काल चर है, यदि एक स्टेटलेस विधि अपना मान निर्धारित करती है, तो मूल्य विधि निकास पर समाप्त हो जाएगा। लेकिन यहां, मैं अपनी दूसरी विधि कॉल के माध्यम से भी '250' मान प्राप्त करने में सक्षम हूं। क्या यह स्टेटलेस अवधारणा का उल्लंघन है? क्या मुझे कुछ कमी है?

उत्तर

2

दिलचस्प सवाल और मूल रूप से आप पूरी तरह से सही हैं। मैंने कुछ शोध किया और सामान्य सलाह यह है: "प्रत्येक विधि कॉल के बाद सब कुछ भूलने के लिए अपने बीन की अपेक्षा करें ..." (page 81)। इसके अलावा, उस संसाधन के अनुसार, स्टेटलेस सत्र बीन्स की स्थिति को बनाए रखने के लिए जिम्मेदार एल्गोरिदम कंटेनर/विक्रेता विशिष्ट है। तो कंटेनर विधि निष्पादन के बाद उदाहरण को नष्ट, पुनर्निर्मित या साफ़ करने का विकल्प चुन सकता है।

आप एक बहु थ्रेडेड टेस्ट बना सकते हैं और देख सकते हैं कि यह मल्टीपाइल क्लाइंट के साथ कैसे व्यवहार करता है।

+0

Okay.You हैं सही है.अगर मैं गलत नहीं हूँ, इसी तरह के परिदृश्य EJB2.0 में अलग तरह से व्यवहार/Weblogic EJB कंटेनर, जहाँ मेरे EJB ग्राहक getValue के रूप में 0 है, मेरी अगली कॉल पर मतलब है, कंटेनर के साथ परोसा एक अलग ejb उदाहरण। – ASChakkalakal

2

किसी भी अवधारणा का कोई उल्लंघन नहीं है। इसका कारण यह है कि अन्य अनुरोधों की सेवा के लिए पूल से कंटेनर द्वारा बीन का एक ही उदाहरण चुना जाता है।

स्टेटलेस बीन्स & पूल किए जाते हैं इसलिए उनके पास राज्य के बीन्स पर प्रदर्शन लाभ होता है, उनका मुख्य उद्देश्य किसी भी राज्य को पकड़े बिना प्रसंस्करण कर रहा है।

संवेदनशील या उपयोगकर्ता विशिष्ट डेटा को स्टेटलेस बीन्स के उदाहरणों में संग्रहीत नहीं किया जाना चाहिए। राज्य के किसी भी विचार के बिना डेटा को संसाधित करने के लिए उन्हें बड़े पैमाने पर इस्तेमाल किया जाना चाहिए।

here कंटेनर द्वारा संचालित उनके जीवन-चक्र कार्यक्रमों के लिए संदर्भित कर सकते हैं।

+0

विवरण के लिए धन्यवाद। यहां एक और सवाल है। @stateless (mappedName = "XXX"), क्या मेरे ejb को XXX के बाद यहां संदर्भित किया जाएगा? मैंने जेबॉस एएस को XXX के बावजूद एक अलग जेएनडीआई मैपिंग दिया है। क्या यह पूरी तरह से विक्रेता विशिष्ट है? – ASChakkalakal

+0

नहीं, मैप किए गए नाम वैकल्पिक विशेषता है और विक्रेता को छोड़ दिया गया है, जेबॉस इस विशेषता को ऑप्ट आउट करता है और अपने स्वयं के सम्मेलन का उपयोग करता है। –

+0

मैंने एक और दिलचस्प बात देखी है, मैपनाम केवल तभी लिया जाता है जब मेरा सेवा इंटरफ़ेस रिमोट इंटरफ़ेस था। जब मैंने एक ईजेबी के लिए मैप किए गए नाम को निर्दिष्ट किया जिसका सेवा इंटरफ़ेस @ लोकाल (या यहाँ कुछ भी निर्दिष्ट नहीं किया गया है) के साथ एनोटेट किया गया है, तो मेरे जेबॉस कंटेनर ने इसे अनदेखा किया और अपने स्वयं के जेएनडीआई के साथ बाध्य, कुछ XXXXX/स्थानीय – ASChakkalakal

5

अलग-अलग तरीकों को कॉल करते समय राज्यवार बनाम स्टेटलेस बीन व्यवहार के बीच अंतर।


STATEFUL: एक स्टेटफुल बीन पर विभिन्न विधियों को कॉल करते समय, विभिन्न बीन उदाहरण बनाए जाते हैं।

((MyStatefulBeanRemote) ctx.lookup("ejb/MyStatefulBean")).doingStatefulThing(); 

((MyStatefulBeanRemote) ctx.lookup("ejb/MyStatefulBean")).doingNothingStatefulThing(); 

***Output: Note the creation of separate objects.*** 

INFO: Calling doingStatefulThing...com.myeclipseide.ejb3.stateful.**[email protected]** 

INFO: Calling doingNothingStatefulThing...com.myeclipseide.ejb3.stateful.**[email protected]** 

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

((MyStatelessBeanRemote) ctx.lookup("ejb/MyStatelessBean")).doSomething(); 

((MyStatelessBeanRemote) ctx.lookup("ejb/MyStatelessBean")).doNothing(); 

***Output: Note the reuse of he bean object.*** 

INFO: Doing something ...com.myeclipseide.ejb3.stateless.**[email protected]** 

INFO: Doing Nothing ...com.myeclipseide.ejb3.stateless.**[email protected]**