मेरे आवेदन में मैं जेएमएस से पढ़ता हूं और डेटाबेस को लिखता हूं। इस स्थिति को संभालने के लिए ActiveMQ प्रलेखन में निम्नलिखित हैं:

onMessage
try {
   if I have not processed this message successfully before {
   do some stuff in the database / with EJBs etc
   jdbc.commit() (unless auto-commit is enabled on the JDBC)
}
jms.commit()
} catch (Exception e) {
   jms.rollback()
}

मेरा सवाल यह है कि हम jms.commit() करते समय समस्या का सामना करते हैं, फिर हम जेएमएस सत्र को रोलबैक करते हैं। लेकिन हमारा डीबी कमिट पहले ही कर चुका है। चूंकि हमने जेएमएस सत्र को रोलबैक किया है, कतार उस डेटा को फिर से उपभोक्ता को भेज देगी जिसके परिणामस्वरूप डेटाबेस में डुप्लिकेट डेटा होगा। हमने ActiveMQ आर्टेमिस कतार पर विफलता परिदृश्य पर इसका अनुभव किया है। क्या कोई वैकल्पिक तरीका है जिससे मैं डीबी या डेटा हानि पर डुप्लीकेट किए बिना इसे संभाल सकता हूं?

1
Viraj 25 नवम्बर 2020, 08:42

1 उत्तर

सबसे बढ़िया उत्तर

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

ऐसा प्रतीत होता है कि आप XA लेन-देन से बचते हैं (पता नहीं क्यों) और मैन्युअल रूप से अलग-अलग JMS और JDBC लेनदेन कर रहे हैं या वापस ले रहे हैं। इस दृष्टिकोण के साथ डेटा असंगति का जोखिम हमेशा (काफी अधिक) होने वाला है। आप इससे कैसे निपटते हैं यह आपकी विशिष्ट बाधाओं पर निर्भर करेगा।

स्पष्ट होने के लिए, आपके द्वारा उद्धृत ActiveMQ दस्तावेज़ से छद्म कोड 2-चरण प्रतिबद्धता का उपयोग कर नहीं है।

2
Justin Bertram 25 नवम्बर 2020, 16:02