2010-11-07 17 views
16

मेरे पास बीन-प्रबंधित लेनदेन के साथ एक स्टेटलेस बीन है, और इस तरह की एक विधि:UserTransaction प्रचार कैसे करता है?

@Stateless 
@TransactionManagement(TransactionManagementType.BEAN) 
public class ... { 

    @Resource 
    private UserTransaction ut; 
    @EJB 
    private OtherStatelessBeanLocal other; 

    public void invokeSomeMethods() 
     ut.begin(); 
     ... 

     // invoke other bean's methods here. 
     other.method(); 

     ... 
     ut.commit(); 

    } 

} 

तो UserTransactionOtherStatelessBeanLocal बीन के लिए प्रचार कैसे करता है?

+0

अच्छी तरह से पारित नहीं हो सकता (इस मामले में, अन्य) एक और सेम में कार्यक्रम संबंधी लेन-देन का उपयोग कर कार्यक्रम संबंधी लेन-देन का उपयोग कर यह नहीं है, है ना? –

उत्तर

32

UserTransaction वस्तु एक वस्तु कंटेनर जो लपेटता API तक पहुंच को कॉल कंटेनर आंतरिक रूप से उपयोग करता है, विशेष रूप से javax.transaction.TransactionManager द्वारा आपूर्ति की है। TransactionManagerbegin, commit, rollback और javax.transaction.Transaction getTransaction()

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

सुरक्षा प्रचार इसी तरह काम करता है, जैसा कि जेएनडीआई लुकअप करता है जो जादुई रूप से सही मॉड्यूल या घटक के java:comp/env नेमस्पेस को इंगित करता है। निचली पंक्ति यह है कि आप थ्रेडलोकल्स के बिना ऐप सर्वर को कार्यान्वित नहीं कर सकते हैं। प्रचार की तुलना में अधिक सक्रिय लगता है, जब सच में यह केवल धागे को छोड़ने का कार्य नहीं है, इसलिए कंटेनर और सभी शामिल हैं अभी भी आपकी "सामान" पा सकते हैं।

लेनदेन प्रबंधन शर्तों में वापस, ऑब्जेक्ट जो एक लेनदेन प्रबंधक अपने थ्रेडलोकल में ट्रैक करेगा, आमतौर पर Transaction और TransactionSynchronizationRegistry इंटरफेस दोनों को प्रत्यक्ष या परोक्ष रूप से कार्यान्वित करेगा। इन दो इंटरफेस के बीच, कंटेनर में DataSource एस, EntityManager एस और आपकी ओर से वर्तमान लेनदेन में अन्य संसाधनों को ट्रैक करने के लिए आवश्यक सभी हुक हैं। ये इंटरफेस कंटेनर को SessionSynchronization जैसे कॉलबैक की पेशकश करने के साथ-साथ लेनदेन की समाप्ति पर आपकी ओर से अन्य चीजों को करने का मतलब है जैसे कि एंटीटीमेनर्स को फ़्लश करना/बंद करना, जेएमएस लंबित संदेशों को भेजना, और पाठ्यक्रम में आपके ऐप द्वारा बनाए गए किसी भी टाइमर को जारी रखना लेनदेन का।

+2

सही उत्तर।+1 –

+0

असल में नहीं, क्योंकि यह पूछे जाने वाले प्रश्न पर ज्ञान लागू नहीं करता है। – Thomas

0

ईजेबी 3 के लिए आप आमतौर पर @ ट्रान्सएक्शन एट्रिब्यूट एनोटेशन के साथ लेनदेन प्रसार को परिभाषित करते हैं।

सभी EJB 3.0 अनुप्रयोगों के लिए डिफ़ॉल्ट लेन-देन विशेषता की जरूरत है: एक ग्राहक उद्यम में फली की विधि का आह्वान

है, जबकि ग्राहक लेन-देन संदर्भ के साथ जुड़ा हुआ है, कंटेनर ग्राहक की में उद्यम में फली की विधि का आह्वान लेनदेन संदर्भ।

दस्तावेज़ के लेन-देन प्रकार के लिए यहां हैं: http://download.oracle.com/javaee/6/api/javax/ejb/TransactionAttributeType.html

N.B. दृढ़ता संदर्भ और लेनदेन प्रचार आमतौर पर एक साथ होते हैं लेकिन हमेशा नहीं - सावधान रहें। उदाहरण के लिए, राज्य सत्र सत्र बीन्स में extended persistence context हो सकता है।

+0

विस्तारित दृढ़ता संदर्भ के मामले में ध्यान दें, दृढ़ता संदर्भ अभी भी लेनदेन से जुड़ा हुआ है और अन्य लेनदेन के लिए उपलब्ध नहीं है, जैसे ही होल्डिंग @ स्टेटफुल बीन लेनदेन में शामिल हो जाता है, इसे छोड़ने की अनुमति नहीं है जब तक यह काम करता है या रोलबैक नहीं करता है। लेनदेन के बाहर से @Stateful बीन पर सभी अनुरोध अंततः ConcurrentAccessException के कुछ रूप फेंकने से पहले @AccessTimeout की अवधि के लिए प्रतीक्षा करेंगे। –

4

EJB विनिर्देश के आधार पर, आप एक सेम से एक सौदे के संदर्भ (इस मामले में अपने मुख्य वर्ग ...)

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