2012-11-29 12 views
5

के बीच जावा ईई 6 शेयर उदाहरण मुझे लगता है कि मुझे यहां बुनियादी समझ की समस्या है और मुझे उम्मीद है कि कोई मुझे यह समझा सकता है।राज्य EJBs

चलें कहते हैं कि हम एक स्टेटफुल EJB_A और स्टेटफुल EJB_B और एक sessionscoped ManagedbeanA है:

@Stateful 
@LocalBean 
public class EJB_A { 
} 

@Stateful 
@LocalBean 
public class EJB_B { 
    @EJB 
    EJB_A ejb; 
} 
@ManagedBean 
@SessionScoped 
public class ManagedBeanA { 
    @EJB 
    EJB_A ejb; 
} 

ManagedBeanA में, EJB_A बनाई गई है। अब जब मैं ईजेबीबी का उपयोग करता हूं, जिसमें संपत्ति के रूप में EJB_A है, तो EJB_A का एक नया उदाहरण EJB_B के भीतर बनाया गया है। यह EJB_A का एक ही उदाहरण नहीं है जो पहले प्रबंधित बीनए में बनाया गया था।

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

आप

+0

जब आप कहते हैं कि मिश्रित " अब जब मैं ईजेबीबी का उपयोग करता हूं "इसका मतलब क्या है? आपने यह कैसे सत्यापित किया कि यह वही उदाहरण नहीं है? –

+0

जब मैं EJB_B को instianciate और EJB_A की गुणों (उदा। एक स्ट्रिंग-प्रॉपर्टी) को देखता हूं, तो EJB_A बीन के गुण EJB_A के गुणों से भिन्न होते हैं जो प्रबंधित बीन द्वारा instanciated था। – user1727072

+0

आप कहां 'instanciate' EJB_B; किसी अन्य प्रबंधितबेन या जावा क्लाइंट (रिमोट लुकअप) के भीतर? –

उत्तर

9

हाँ, आप ऊपर अलग अवधारणाओं, और अलग अलग APIS भी ... मैं नहीं बल्कि @Inject @EJB से अधिक का उपयोग करें और इंजेक्शन उदाहरण के दायरे निर्दिष्ट करें ..

@Stateful 
@LocalBean 
public class EJB_A { 
} 

@Stateful 
@LocalBean 
public class EJB_B { 
    @Inject @SessionScoped 
    EJB_A ejb; 
} 
@ManagedBean 
@SessionScoped 
public class ManagedBeanA { 
    @Inject @SessionScoped 
    EJB_A ejb; 
} 
+0

क्या आप समझा सकते हैं कि मुझे @EJB के बजाय @Inject का उपयोग क्यों करना चाहिए? – user1727072

+1

वैसे, विषय की गहराई से चर्चा इस पर है: [लिंक] http://www.seamframework.org/107780.lace मूल रूप से भेदभाव कारक यह है कि '@ इंजेक्ट' हमेशा के दायरे से अवगत है इंजेक्शन ऑब्जेक्ट और आप सुनिश्चित हैं कि इंजेक्शन उदाहरण एक प्रबंधित व्यक्ति है (इस प्रकार खराब रिमोट बीन क्रमिकरण समस्याओं को रोकता है)। '@ इंजेक्ट' का उपयोग करके आप 'कभी-कभी प्रॉक्सीकृत) प्रबंधित ऑब्जेक्ट प्राप्त करते हैं, जिसका उपयोग आप एक संसाधन प्राप्त करते हैं, एक साधारण जेएनडीआई लुकअप –

+0

से बहुत अलग नहीं है धन्यवाद, जो मेरे लिए बहुत कुछ स्पष्ट करता है :)! – user1727072

1

धन्यवाद मुझे लगता है मैं दो बातों को मिलाया लगता है - @Sessionscoped और @Stateful।

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

तो एक @ स्टेटफुल-ईजेबी के पास एन: 1 संबंध है (एन @ स्टेटफुल-ईजेबी बिल्कुल एक ग्राहक के हैं) और @ स्टेटलेस-ईजेबी में एन: एम संबंध है (एन @ स्टेटलेस-ईजेबीएस एम क्लाइंट से संबंधित है)। इसका मतलब है कि एक ईजेबी-इंस्टेंस को कई अन्य ईजेबी द्वारा @Stateful EJB के लिए @ EJB-Annotation का उपयोग करके साझा नहीं किया जा सकता है।

ऐसा लगता है कि दूसरी ओर एक @ सत्र-प्रेरित-प्रबंधितबेडियन केवल प्रति ग्राहक बनता है।

क्या मुझे यह अधिकार मिला?

2

मैंने कुछ पढ़ा here

कारण है कि प्रत्येक देखने() एक नया सेम पहचान के निर्माण में रिमोट या स्थानीय व्यापार इंटरफेस परिणाम एक EJB 3.0 स्टेटफुल सत्र सेम की। लुकअप से लौटाए गए प्रत्येक संदर्भ को अलग-अलग स्टेटस सत्र बीन से संदर्भित किया गया है। यह निर्धारित करने के लिए कॉलर पर निर्भर करता है कि वह उस संदर्भ तक पहुंच प्रबंधित करना चाहता है। आम तौर पर एक वेब एप्लिकेशन संदर्भ के बाद किसी HttpSession या एप्लिकेशन-व्यापी (ServletContext) दायरे में संदर्भ संग्रहीत करेगा।

और:

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

तो आप वास्तव में सही हैं।जब आप अपने उदाहरण का उपयोग करना चाहते हैं तो आपको इसे कहीं और पुनर्प्राप्त करने के लिए प्रबंधित बीन का उपयोग करना होगा, क्योंकि ईजेबी इंस्टेंस इस सत्र संदर्भ से जुड़ा हुआ है। इसलिए यदि आप इसे सरल बनाना चाहते हैं और सुनिश्चित करें कि प्रति सत्र एक बार ईजेबी मौजूद है, तो सीडीआई का उपयोग करें और ईजेबी को स्वयं @javax.enterprise.context.SessionScoped के साथ अतिरिक्त रूप से एनोटेट करें; आप सुनिश्चित कर सकते हैं की तुलना में।

+0

आपको बहुत मददगार धन्यवाद! – user1727072

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