मैं एक सेवा का उपयोग करके डीबी में एक आइटम को जारी रखने की कोशिश कर रहा हूं और बाद की सेवा के लिए एक जेएमएस संदेश को फायर कर रहा हूं ताकि वह लगातार आइटम उठा सके ताकि वह इसे संसाधित कर सके। यह विशेष ऑपरेशन एक ही लेनदेन में होता है। लेकिन कभी-कभी दौड़ की स्थिति के कारण, दूसरी सेवा संबंधित वस्तु को लाने में सक्षम नहीं होती है क्योंकि यह अभी तक कायम नहीं है।

मेरा उपयोग मामला बहुत आम है और विभिन्न मंचों में इससे संबंधित बहुत सारी चर्चाएं हैं। इस समस्या का एक समाधान CDI ईवेंट का उपयोग करना है। मैंने वही कोशिश की और समस्या का एक हिस्सा हल कर सका। छद्म कोड इस प्रकार है:

@Inject
@Transaction
private Event<Item> itemEvent;

public void handleItem(Item item) {
  //code to persist the item
  itemEvent.fire(item);
}

@Asynchronous
public void observeAfterTransactionCompletion(@Observes(during = TransactionPhase.AFTER_SUCCESS) @Transaction Item item) {
  //code to send JMS message to the second service
}

मेरा एकमात्र मुद्दा यह है कि जब दृढ़ता सफल होती है और घटना को निकाल दिया जाता है और जेबॉस सर्वर डाउन होने पर पर्यवेक्षक घटना को संसाधित करना शुरू कर देता है, तो दूसरी सेवा को अधिसूचित नहीं किया जाएगा क्योंकि जेएमएस संदेश नहीं भेजा जाएगा।

क्या सीडीआई कंटेनर आंतरिक रूप से इस परिदृश्य को संभाल सकता है ताकि घटना को हमेशा लागू किया जा सके? क्या सर्वर पर पर्यवेक्षक को स्वचालित रूप से अधिसूचित किया जाएगा? यदि नहीं, तो मैं इस परिदृश्य से कैसे निपटूं ताकि मेरा दृष्टिकोण मूर्खतापूर्ण साबित हो?

ध्यान दें: जब तक संदेश उपलब्ध नहीं हो जाता, तब तक मैं दूसरी सेवा में पुनः प्रयास करने का तरीका आजमा चुका हूं। दूसरी कतार में भी घटना को जारी रखना एक वैकल्पिक दृष्टिकोण है जो बहुत थकाऊ लगता है। एक स्मार्ट दृष्टिकोण की तलाश में।

अद्यतन करें: मेरा प्रारंभिक कोड इस तरह लिखा गया था कि दृढ़ता और संदेश एक ही लेन-देन में था। लेकिन इसके परिणामस्वरूप पहली सेवा दृढ़ता सफल होने से पहले दूसरी सेवा द्वारा संदेश की खपत हुई, जिसके परिणामस्वरूप त्रुटि हुई क्योंकि दूसरी सेवा को आवश्यक डेटा नहीं मिला जो अभी तक कायम है।

अद्यतन 2: प्रारंभिक दृष्टिकोण छद्म कोड निम्नानुसार है: @TransactionAttribute(TransactionAttributeType.REQUIRED) सार्वजनिक शून्य प्रक्रिया संदेश () { // कोड डीबी को डेटा जारी रखने के लिए // उपभोक्ता को JMS संदेश प्रकाशित करने के लिए कोड }

यहां तक ​​कि xa-datasouce और xa-connection फ़ैक्टरी का उपयोग करके, समस्या अभी भी मौजूद है।

1
Gandhi 24 जिंदा 2019, 12:50

2 जवाब

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

CDI ईवेंट लगातार नहीं होते हैं और इसलिए सर्वर पुनरारंभ होने के बाद वे फिर से ट्रिगर नहीं होते हैं।

अंत में हमने संदेश प्रकाशित करने से पहले डीबी दृढ़ता का उपयोग करके और दो अलग-अलग लेनदेन में दृढ़ता और प्रकाशन को विभाजित करके इस मुद्दे को हल किया। हालाँकि, संदेश प्रकाशन त्रुटियों या संदेश प्रकाशन के शुरू होने से पहले सर्वर के पुनरारंभ होने की स्थिति में हमें संदेश दोहराव को स्वयं संभालने की आवश्यकता होती है।

0
Gandhi 20 जून 2019, 09:57

एक दृष्टिकोण एक्सए लेनदेन का उपयोग करना है।

JMS और डेटाबेस संसाधन दोनों एक ही लेन-देन में शामिल होते हैं, इसलिए JMS संदेश को प्रतिबद्ध पर निकाल दिया जाता है, या तो डेटाबेस अपडेट में त्रुटि या JMS संदेश भेजने में त्रुटि पूरे ऑपरेशन के रोलबैक को ट्रिगर करेगी।

ध्यान दें कि आपको डेटा स्रोत की परिभाषा बदलनी होगी xa-datasource का उपयोग करना होगा, xa का उपयोग करने के लिए JMS कनेक्शन फ़ैक्टरी कॉन्फ़िगरेशन को अपडेट करना होगा और JMS सत्र को भी लेन-देन करना होगा

 <!-- JMS connection factory configuration -->
 <pooled-connection-factory name="myCxFactory">
     <transaction mode="xa"/>
     [...]
 </pooled-connection-factory>

// JMS session creation (message producer)
Session session = connection.createSession(true, Session.SESSION_TRANSACTED);

यह भी ध्यान दें कि केवल संदेश उत्पादन ही लेन-देन का हिस्सा है, न कि उसका उपभोग

1
Gab 28 जिंदा 2019, 13:13