2011-12-31 25 views
8

निम्नलिखित को पूरा करने का सबसे अच्छा तरीका क्या है?@MessageDriven लेनदेन और पुनर्विक्रेता semantics

  • @MessageDriven सेम डेटाबेस पर कुछ काम करता है
  • विफलता पर, मैं डीबी लेनदेन
  • वापस रोल करना चाहते हैं लेकिन मैं यह भी JMS संदेश redelivered नहीं बनना चाहते, यानी, फिर से नहीं है प्रयत्न।

मैं कुछ तरीके कि पराक्रम काम के बारे में सोच सकते हैं। क्या कोई अन्य है, और कौन सा सबसे अच्छा है?

  • उपयोग @TransactionManagement(type=BEAN) और UserTransaction, और स्पष्ट रूप से वापस अपवाद को पकड़ने के बाद रोल। उदा .: कंटेनर से प्रबंधित लेनदेन

    catch (Exception e) { e.printStackTrace(); utx.rollback(); }

  • का प्रयोग करें, onMessage पर @TransactionAttribute(value=NOT_SUPPORTED) निर्दिष्ट और फिर @TransactionAttribute(value=REQUIRED) के साथ एक अलग विधि के लिए डीबी गतिविधि प्रतिनिधि।

  • लेनदेन को अकेले हैंडलिंग छोड़ दें और सर्वर में पुनः प्रयास संपत्ति को फिर से कॉन्फ़िगर करें। मैं ग्लासफ़िश 3.1.1 का उपयोग कर रहा हूं, और मुझे बिल्कुल यकीन नहीं है कि इसे कैसे सेट किया जाए।

  • अकेले सबकुछ छोड़ दें और onMessage शरीर में पुनः वितरण के लिए संदेश की जांच करें, और फिर से वितरित होने पर बाहर निकलें। (message.getJMSRedelivered()?)

क्या वहां अच्छी तरह से काम किया है? क्या इससे निपटने के लिए एक मानक/सर्वोत्तम अभ्यास तरीका है?

उत्तर

8

सरल और सबसे पोर्टेबल दृष्टिकोण onMessage() पर @TransactionAttribute(value=NOT_SUPPORTED) का उपयोग के रूप में आप राज्य और @TransactionAttribute(REQUIRES_NEW)

के साथ एक और सेम के लिए डीबी काम ले जाने के लिए इस रूप में अलग विधि दृष्टिकोण से काम नहीं चलेगा बारे में सावधान रहें है। एक जेएमएस एमडीबी में onMessage() विधि एकमात्र तरीका है जहां @TransactionAttribute का उपयोग किया जा सकता है।

+1

धन्यवाद, यह पूरी तरह से काम किया। एमडीबी में @ ट्रान्सएक्शन एट्रिब्यूट के बारे में नोट महत्वपूर्ण था - आप सही हैं, आप केवल 'मैसेज' पर टिप्पणी कर सकते हैं। मैंने अंत में 'मैसेज' को एनोटेट नहीं किया लेकिन तर्क को 'REQUIRES_NEW' के साथ किसी अन्य ईजेबी में स्थानांतरित कर दिया। – wrschneider

+0

बस एक नोट के रूप में, यह "आवश्यक" के साथ एनजेबी बच्चे के साथ काम करता है। – apetrelli

2

व्यक्तिगत रूप से मैं एमडीबी में कभी भी कोई काम नहीं करता, लेकिन तुरंत (इंजेक्शन) सत्र बीन में भेजता हूं।

यह बीन तब डीबी काम करता है। यह या तो एक नया लेनदेन शुरू करता है, या मैं बीन से कोई अपवाद पकड़ता हूं और इसे लॉग करता हूं (लेकिन इसे प्रचारित न करें, इसलिए कोई पुनर्विक्रेता नहीं)।

यह भी लाभ है कि व्यापार तर्क अन्य स्थानों से आसानी से पुन: प्रयोज्य है।