मेरी समस्या को आसान बनाने के लिए, मैं @Transactionnal विधि CreateUser() के साथस्प्रिंग/RabbitMQ: लेन-देन प्रबंधन
APP1 है:
- सम्मिलित डेटाबेस में नया उपयोगकर्ता
- RabbitMQ में async संदेश जोड़ें ताकि उपयोगकर्ता को एक अधिसूचना मेल
- (संभावित रूप से कुछ अतिरिक्त कोड, लेकिन अधिक नहीं)
RabbitMQ संदेश consummer साथ App2
- Consummes वास्तविक समय में डाक कतार पर संदेश
- डेटाबेस
- में पढ़ें मेल डेटा मेल भेजें
समस्या यह है कि कभी कभी होता है, ऐप 2 ऐप 1 पर भी लेनदेन करने से पहले RabbitMQ संदेश का उपभोग करने का प्रयास करता है। इसका अर्थ है कि App2 डेटाबेस पर मेल डेटा नहीं पढ़ सकता क्योंकि उपयोगकर्ता अभी तक नहीं बनाया गया है।
कुछ समाधान हो सकता है:
-
App2 पर
- उपयोग READ_UNCOMMITED अलगाव स्तर
- RabbitMQ संदेशों वितरण में कुछ देरी (या consummer पर कुछ RetryTemplate)
- बदलें जिस तरह से हम ईमेल भेजने जोड़े ...
मैंने देखा है कि वसंत में एक खरगोश ट्रान्सएक्शन प्रबंधक है, लेकिन मुझे समझ में नहीं आता कि यह कैसे माना जाता है ork। लेनदेन हैंडलिंग सामान के आंतरिक हमेशा समझने में थोड़ा मुश्किल लगते हैं और दस्तावेज़ीकरण इतना मदद नहीं करता है।
क्या ऐसा कुछ करने का कोई तरीका है?
- एक @Transactionnal विधि
- जब लेनदेन समाप्त होता है में एक RabbitMQ कतार में एक संदेश जोड़ें, संदेश कतार के लिए प्रतिबद्ध है, और परिवर्तन डेटाबेस के लिए प्रतिबद्ध हैं
- तो संदेश यह है कि डीबी लेनदेन समाप्त होने से पहले उपभोग नहीं किया जा सकता
कैसे? और अगर मैं अतुल्यकालिक संदेशों के बजाय सिंक्रोनस RabbitMQ संदेश भेजता हूं तो उदाहरण के लिए क्या उम्मीद करनी चाहिए? क्या यह थ्रेड को प्रतिक्रिया या कुछ के लिए इंतजार कर देगा? क्योंकि हम विभिन्न उपयोगकेस के लिए सिंक और एसिंक संदेश भेजते हैं।
क्या मैं सही हूँ कि दोनों क्षुधा एक ही कतार से संदेश का उपभोग में उन 2 संचालन नहीं डाल करने के लिए है? – pinepain
नहीं, ऐप 1 ने कतार में संदेश डाले हैं और ऐप 2 उस कतार में संदेश उपभोग करता है –
क्या आपने इस समस्या को किसी भी तरह हल करने का प्रबंधन किया था? मुझे एक ही मुद्दे का सामना करना पड़ रहा है। –