2012-02-10 9 views
13

मैं jboss पर चल रहे एक स्प्रिंग वेब अनुप्रयोग है कि वर्तमान में डाटाबेस लेनदेन और jms के लिए JmsTransactionManager के लिए HibernateTransactionManager उपयोग करने के लिए कॉन्फ़िगर किया गया है है। जेएमएस के लिए हम ऊंट और एक्टिवएमक्यू का उपयोग करते हैं, हमारा डेटाबेस डीबी 2 है। एक लेनदेन के भीतर मुझे डेटाबेस में कई रिकॉर्ड लिखने और दो एसिंक्रोनस जेएम संदेश भेजने की आवश्यकता है। जेएमएस संदेश घटना अधिसूचनाएं हैं और मैं केवल डेटाबेस लेनदेन करने पर उन्हें भेजना चाहता हूं।स्प्रिंग लेन-देन JDBC के Synchonization और JMS

मैं जेडीबीसी लेनदेन पहले ही प्रतिबद्ध होने के बाद ब्रोकर के साथ संचार के जोखिम को स्वीकार करने के लिए तैयार हूं (और इस प्रकार कोई संदेश नहीं भेजा गया है लेकिन डीबी प्रतिबद्ध है) इसलिए मुझे नहीं लगता कि मुझे उचित एक्सए की आवश्यकता है।

मुझे विश्वास है कि मैं क्या जरूरत है "सर्वश्रेष्ठ प्रयास" लेन-देन प्रबंधन वसंत लेन-देन तुल्यकालन का उपयोग कर रहा है।

वसंत दस्तावेज इस तथ्य पर संकेत देता है कि वसंत दो लेनदेन को सिंक्रनाइज़ करेगा और जेडीबीसी लेनदेन के बाद ही जेएमएस लेनदेन करेगा - लेकिन मुझे नहीं लगता कि यह बहुत स्पष्ट है। वसंत प्रलेखन यहाँ http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/transaction.html#tx-resource-synchronization यह कैसे काम करता के बारे में पर्याप्त विस्तार में जाने नहीं देता है।

मैं कहना है कि वसंत क्या मैं कुछ जावाडोक नीचे सहित चाहते हैं जाएगा अन्य स्रोतों की एक जोड़ी मिल गया है, और मैं कुछ एकीकरण परीक्षणों कि भी यह दिखाने के लिए लिखा है।

http://static.springsource.org/spring/docs/3.0.x/api/org/springframework/jms/support/JmsAccessor.html#setSessionTransacted%28boolean%29 पर जावाडोक यहाँ setSessionTransacted जैसे मैं वास्तव में क्या चाहते हैं लगता है।

मैं क्या देखा है मैं के साथ इस तरह सही पर सेट लेनदेन कैमल JmsConfiguration बनाने लगता है से पर्याप्त है:

<bean id="jmsConfig" class="org.apache.camel.component.jms.JmsConfiguration"> 
    <property name="connectionFactory" ref="pooledConnectionFactory"/> 
    <property name="transacted" value="true"/> 
    <property name="concurrentConsumers" value="10"/> 
</bean> 

हालांकि मैं की जरूरत है किसी को मैं कौन थोड़ा उलझन में है के साथ काम को समझाने के लिए और जो सोचता है मेरी एकीकरण परीक्षण केवल जानबूझकर वसंत सुविधा के बजाय खराब दस्तावेज वाले दुष्प्रभाव के कारण काम करता है।

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

+0

हाय वहाँ, क्या आपको अब तक अपने प्रश्न का उत्तर मिला है? – snowindy

+0

हाय, वास्तव में नहीं। मैंने अभी भी वास्तव में कोई स्पष्ट दस्तावेज नहीं देखा है जो मैं चाहता था लेकिन अब हम बिना किसी मुद्दे के उत्पादन में इसका उपयोग कर रहे हैं। – laurie

उत्तर

3

यह लेख मदद Distributed transactions in Spring, with and without XA का हो सकता है। मुझे नहीं लगता कि यह आपके मामले को विशेष रूप से कवर करता है - संदेश भेजना + डेटाबेस अपडेट करना।

+0

धन्यवाद, मैंने उस लेख को दो बार पढ़ा है।सर्वश्रेष्ठ प्रयासों में 1 पीसी अनुभाग में वे वसंत सिंक्रनाइज़ेशन के दो उदाहरण प्रदान करते हैं लेकिन एक में वे एक ट्रांज़ेक्शनएवेयर कनेक्शन कनेक्शन फैक्ट्रीप्रॉक्सी और दूसरे में एक चेनट्रैक्शन मैनेजर कॉन्फ़िगर करते हैं। अगर मुझे एक ही परिणाम प्राप्त करने के लिए कोई अतिरिक्त कॉन्फ़िगरेशन करने की आवश्यकता नहीं है तो मैं नहीं चाहूंगा। – laurie

0

आधिकारिक स्प्रिंग बूट रिपोजिटरी में जेटीए उदाहरण शामिल हैं जो जेएमबीएस को जेडीबीसी के साथ Atomikos, Bitronix या Java EE server JBoss WildFly पर आधारित करते हैं।

इसके अतिरिक्त मैंने कुछ उदाहरण भी बनाए हैं जो located in my Github repository हैं। इसमें गैर-वसंत बूट (शुद्ध वसंत) उदाहरण भी शामिल है।

+0

आपके गिट भंडार से लिंक अब मान्य नहीं है। –

0

आप स्थानीय लेनदेन उपयोग कर रहे हैं और USECASE डेटाबेस से बचाने और फिर JMS भेजने पर

तो फिर वहाँ तीन मामलों हो सकता है: बस प्राप्त करने के बाद

  1. अपवाद (DB और JMS से पहले)

कोई समस्या नहीं है सब कुछ

01 rolledback हो जाएगा
  1. डीबी को सहेजने के बाद, हम अपवाद

अगर कोई ऐसा डालने आपरेशन है, वहाँ की वजह से डीबी में एकाधिक पंक्तियाँ हो जाएगा प्रत्येक retries.With पुन: प्रयास, एक डालने JMS के लिए done.And हो जाएगा, संदेश DeadLetterQueue के लिए जाना जाएगा

  1. डीबी के लिए बचत और JMS के लिए भेजने के बाद, हम

    अगर कोई ऐसा डालने ऑपरेशन है एक अपवाद है, वहाँ के कारण retries.With प्रत्येक पुन: प्रयास डीबी में एकाधिक पंक्तियाँ हो जाएगा, एक डालने से किया जाएगा। और JMS के लिए, संदेश DeadLetterQueue को

अब आप XA उपयोग करना चाहते हैं न, तो समाधान

1 हो सकता है), तो चेक जाना होगा (गड़बड़ age.getJmsRedelivered() {...}

यदि नहीं, तो इस प्रक्रिया में यह

तो इसकी redelivered, देखें कि क्या आप इसे पहले ही संसाधित

जांच करें कि डेटा संदेश के विवरण के आधार डेटाबेस में है

ध्यान दें कि फिर से प्रसव इतना दुर्लभ हैं, इस चेक भी दुर्लभ है और कोई भूमि के ऊपर

2) अपने विधि idempotent है, तो आप इस चेक की आवश्यकता नहीं है

+०१२३५१६४१०

और के बारे में XA, XA गारंटी देता है कि संदेश केवल एक बार वितरित और कई संसाधनों

लेकिन XA के साथ, आप भूमि के ऊपर

तो अगर आप XA के बिना प्रबंधन कर सकते हैं, यह बेहतर

है भर में लेन-देन को सिंक्रनाइज़ है
संबंधित मुद्दे