मुझे वर्तमान में एक संदेश खोने का मुद्दा है। यह त्रुटि शायद ही कभी होती है, लेकिन अक्सर परेशान होने के लिए पर्याप्त होती है। यहां समस्या का संदर्भ दिया गया है:क्या MSMQ MessageQueue.Peek का उपयोग कर संदेशों को खोना संभव है?
- मैंने Windows 2003 सर्वर पर एक MSMQ, goldmine_service_queue पर संदेश पत्रिका चालू कर दी है।
- मैं साबित कर सकता हूं कि संदेश संदेश पत्रिका में संदेश प्रकट होने के बाद से goldmine_service_queue में डाला जा रहा है। यह जानकारी संदेश गायब होने के बारे में समय की जानकारी देती है।
- लॉगिंग फ़ंक्शन http://logging.apache.org/log4net/index.html
- लॉग्स त्रुटियों को नहीं दिखाते हैं।
- कार्यकर्ता फ़ंक्शन (नीचे दिखाया गया) विंडोज सेवा के थ्रेड के भीतर निष्पादित करता है। कतार से संदेशों (कार्य वस्तुओं) पर ध्यान देने और उन्हें संसाधित करने के लिए यह ज़िम्मेदार है।
- लॉग से, मुझे दृढ़ता से संदेह है कि मेरा मुद्दा MessageQueue.Peek और टाइम आउट व्यवहार से संबंधित हो सकता है।
क्या टाइमआउट और संदेश एक ही समय में होने के लिए संभव है? क्या इस त्रुटि से बचने में मदद के लिए सर्विस स्टॉप जांच को संभालने का मेरे लिए एक बेहतर तरीका है?
private void workerFunction()
{
logger.Info("Connecting to queue: " + Settings.Default.goldmine_service_queue);
MessageQueue q = new MessageQueue(Settings.Default.goldmine_service_queue);
q.Formatter = new ActiveXMessageFormatter();
while (serviceStarted)
{
Message currentMessage = null;
try
{
currentMessage = q.Peek(new TimeSpan(0,0,30));
}
catch (System.Messaging.MessageQueueException mqEx)
{
if (mqEx.ToString().Contains("Timeout for the requested operation has expired"))
{
logger.Info("Check for service stop request");
}
else
{
logger.Error("Exception while peeking into MSMQ: " + mqEx.ToString());
}
}
catch (Exception e)
{
logger.Error("Exception while peeking into MSMQ: " + e.ToString());
}
if (currentMessage != null)
{
logger.Info(currentMessage.Body.ToString());
try
{
ProcessMessage(currentMessage);
}
catch (Exception processMessageException)
{
logger.Error("Error in process message: " + processMessageException.ToString());
}
//Remove message from queue.
logger.Info("Message removed from queue.");
q.Receive();
//logPerformance(ref transCount, ref startTime);
}
}//end while
Thread.CurrentThread.Abort();
}
प्रतिक्रिया के लिए धन्यवाद: - दौड़ की स्थितियों के बारे में: मुझे यकीन नहीं है कि मैं उन रेस स्थितियों को देखता हूं जिन्हें आप उल्लेख कर रहे हैं। Http://msdn.microsoft.com/en-us/library/t5te2tk0.aspx के अनुसार, MessageQueue.Peek (टाइमआउट) एक अवरुद्ध कॉल है। - मैं एसिंक पैटर्न का उपयोग करने के बारे में चिंतित हूं क्योंकि ProcessMessage कुछ COM ऑपरेशंस करता है। मुझे नहीं पता कि ये ऑपरेशन थ्रेड सुरक्षित हैं या नहीं। मैं चोटी के बजाय रिसीव() का उपयोग करने की कोशिश करने के ठीक हूं, सिवाय इसके कि मुझे नहीं पता कि सर्विस स्टॉप के कारण लूप को रोकने का अवसर कैसे बनाया जाए। –
पुन: 'ProcessMessage' में COM: कोई समस्या नहीं होनी चाहिए यदि केवल एक थ्रेड 'ProcessMessage' चल रहा है (जिसे' प्रक्रिया मैसेज 'पूरा होने के बाद ही एक नया एसिंक प्राप्त करके एसिंक केस में हासिल किया जा सकता है। async में यदि आप कतार को बंद करते हैं (और कैश फ्लश करें --- कुछ खोजों के आधार पर यह वास्तव में कनेक्शन को बंद करने के लिए आवश्यक प्रतीत होता है) और कोई लंबित प्राप्तकर्ता रद्द कर दिया जाएगा। रद्द करने के लिए कोई लूप नहीं है। – Richard