2014-04-10 10 views
5

मैं एक निजी कतार में संदेश भेज रहा ग # के माध्यम से:एमएसएमक्यू सी # - एसीके के माध्यम से संदेश प्राप्त हुआ?

MessageQueue msgQ = new MessageQueue(@".\private$\aaa"); 
msgQ.Formatter = new XmlMessageFormatter(new[] { typeof (String) }); 
msgQ.Send(msg); 

यह काम करता है और मैं कतार में संदेश क्यों दिखाई देता है।

हालांकि, क्या एसीके प्राप्त करने का कोई तरीका है कि संदेश सफलता के साथ कतार पर गया है?

nb

BeginPeek और PeekCompleted एक घटना है जो जब एक संदेश कतार या जब समय की निर्दिष्ट अंतराल समाप्त हो गया है में उपलब्ध हो जाता है उठाया जाता है। यह नहीं मेरी मदद कर रहा है क्योंकि मुझे यह जानने की आवश्यकता है कि संदेश है जिसे मैंने भेजा है msmq द्वारा प्राप्त किया गया था। BeginPeek भी उठाया जाएगा यदि कोई अन्य कतार में एक संदेश दर्ज किया गया है। और आखिरी चीज़ जो मैं चाहता हूं वह BeginPeek के माध्यम से जांचना है - यह संदेश कौन से है।

मैं यह कैसे कर सकता हूं?

NB2

या हो सकता है मैं msgQ.Send(msg); के बाद से चिंता करने की है, तो संदेश नहीं डाला गया था अपवाद बढ़ा देंगे की जरूरत नहीं है ....?

उत्तर

3

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

अब आपके आवेदन के लिए वास्तव में महत्वपूर्ण होना चाहिए वितरण की गारंटी है। मैं इस परिदृश्य से मानता हूं कि आप यह वर्णन कर रहे हैं कि संदेश खो नहीं गया है, यह सुनिश्चित करने के लिए आपको टिकाऊ लेनदेन कतारों की आवश्यकता है। उपलब्ध विकल्पों के बारे में अधिक पढ़ा जा सकता है here

इसके अलावा, अगर आपको पुष्टि करने के लिए उपयोगकर्ता को प्रदर्शित करने के लिए कुछ पहचानकर्ता की आवश्यकता है, तो एक सामान्य अभ्यास इसे भेजने के कोड में उत्पन्न करना और संदेश में ही रखना है। फिर हैंडलिंग कोड आईडी को आवश्यक काम करने के लिए उपयोग करेगा।

+0

मेरा आईआईएस और एमएसएमक कंप्यूटर एक ही मशीन हैं। अगर ऐसा है, तो आने वाली कतार में जाने से पहले आउटगोइंग कतार में कोई संदेश संग्रहीत किया जाता है? इसके अलावा, लेनदेन में पूरा होने के लिए 1 से अधिक ऑपरेशन नहीं हैं ... तो आपको लगता है कि लेनदेन संबंधी कतार की सिफारिश क्यों नहीं की जाती है? –

+0

ठीक है, जैसा कि मेरे उत्तर में लिंक में इंगित किया गया है, यदि गैर-लेनदेन कतार संसाधित करते समय कतार प्रसंस्करण सेवा क्रैश हो जाती है, तो वर्तमान संदेश खो जाता है। यदि यह ठीक है तो गैर-लेनदेन का उपयोग करें। दूसरे प्रश्न के लिए, यदि सभी संचार स्थानीय हैं, तो आउटगोइंग कतार का उपयोग नहीं किया जाना चाहिए। –

1

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

शायद बेहतर समाधान का उपयोग मासट्रांसिट या एनएस सर्विसबस जैसे ढांचे का उपयोग करना होगा और एक प्रतिक्रिया-प्रतिक्रिया करें, जिससे पुनरीक्षक वास्तविक पुष्टि संदेश के साथ प्रतिक्रिया दे सके, न केवल "यह वितरित किया गया है" बल्कि "मैं इसे स्वीकार करता हूं" टाइमआउट विकल्पों के साथ।

+0

नहीं, मैं इसकी तलाश नहीं कर रहा हूं। मैं यह जांचने के लिए एक कोड ढूंढ रहा हूं कि कतार में एक संदेश सही ढंग से डाला गया था। बस इतना ही। कोई डीबी नहीं –

+0

ठीक है, लेनदेन बंद होने पर लेनदेन की कतार कतार में प्रवेश की पुष्टि करती है। लेकिन अगर कतार लेनदेन है, जब आप इसे पढ़ते हैं, तो यह लेनदेन के दायरे में भी है। जहां आप डीटीसी शामिल हैं। – Travis

0

जैसा ओलेक्सि ने विश्वसनीय वितरण के बारे में समझाया है।

हालांकि यह प्रदर्शन पर प्रभाव डाल सकता है।

क्या मेरा सुझाव कर सकते हैं:

क्यों मशीन है कि अन्य व्यवस्था करने के लिए एमएसजी भेज रहा है पर एक MSMQ सर्वर नहीं बना।

क्या मैं सोच रहा हूँ है

  1. सर्वर 1 सर्वर 2
  2. सर्वर 2 प्राप्त करता क़तार में कहते हैं करने के लिए MSMSQ भेजता
  3. सर्वर 2 प्रक्रिया कतार/सर्वर करने के लिए एक MSMQ संदेश भेजने के लिए यहां अपने कोड आग 1
  4. सर्वर 1 MSG (msgId के साथ किसी भी सफल संदेश) प्राप्त करता है
  5. अपने आगे काम करते हैं

यह दृष्टिकोण एक अतिरिक्त मील हो सकता है, लेकिन आपके सर्वर को प्रदर्शन Lag से बाहर रखेगा।

संबंधित मुद्दे