2011-11-15 9 views
9

मेरे पास यह "MessageQueueReceive" नामक कक्षा में है।एमएसएमक्यू लेनदेन के साथ प्राप्त करता है - रोलबैक फिर से संदेश उपलब्ध नहीं करा रहा है

public MessageQueueTransaction BlockingReceive(out Message message) 
{ 
    MessageQueueTransaction tran = null; 
    message = null; 

    tran = new MessageQueueTransaction(); 

    tran.Begin(); 
    try 
    { 
     message = Queue.Receive(new TimeSpan(0, 0, 5), tran); 
    } 
    catch (MessageQueueException ex) 
    { 
     // If the exception was a timeout, then just continue 
     // otherwise re-raise it. 
     if (ex.MessageQueueErrorCode != MessageQueueErrorCode.IOTimeout) 
      throw ex; 
    } 

    return tran; 

} 

तब मेरे प्रसंस्करण पाश इस हैं: -

while (!Abort) 
{ 
    try 
    { 
     tran = this.Queue.BlockingReceive(out msg); 

     if (msg != null) 
     { 
      // Process message here 

      if (tran != null) 
       tran.Commit(); 
     } 
    } 
    catch (Exception ex) 
    { 
     if (tran != null) 
      tran.Abort(); 

    } 
} 

नियंत्रण कक्ष उपकरण दिखाता है कि संदेश कतार मैं उपयोग कर रहा हूँ व्यवहार कर रहे हैं। जर्नल कतार सक्षम नहीं है।

इस कोड कतार बनाता है: - जब यह कहा जाता है

private static MessageQueue CreateMessageQueue(string queueName, bool transactional = false) 
{ 
    MessageQueue messageQueue = MessageQueue.Create(queueName, transactional); 
    messageQueue.SetPermissions("Administrators", MessageQueueAccessRights.FullControl, 
      AccessControlEntryType.Allow); 
    return messageQueue; 
} 

व्यवहार पैरामीटर के रूप में "सही" स्थापित किया जाएगा।

मुझे क्या लगता है कि जब संदेश की प्रसंस्करण के दौरान कोई अपवाद होता है, तो tran.Abort कहा जाता है लेकिन उस समय मैं संदेश को कतार में वापस आने की अपेक्षा करता हूं। हालांकि, यह नहीं हो रहा है और संदेश खो गए हैं।

क्या मुझे कुछ याद आ रही है? क्या कोई देख सकता है कि मैं क्या गलत कर रहा हूं?

+0

क्या कतार आप श्रोता सेवा के लिए स्थानीय पर प्राप्त कर रहे हैं? –

+0

हां, भेजने और प्राप्त करने की प्रक्रिया और कतार सभी एक ही बॉक्स पर हैं। वे निजी कतार हैं। मेरे पास एक ही कोड कुछ अलग-अलग बक्से पर चल रहा है, और सभी को एक ही समस्या दिखाई देती है।इससे पता चलता है कि यह मशीन के बारे में कुछ कर्कश के बजाय इस कोड से संबंधित है। – JohnCC

+0

स्पष्ट प्रश्न मुझे लगता है। क्या आप वाकई गर्भपात के साथ अपवाद को मार रहे हैं? क्या यह संभव है कि आपके संदेश हैंडलिंग कोड में एक अपवाद फेंक दिया गया है जिसे पकड़ा गया है और फिर फेंक दिया गया है, इसलिए यह कभी अपवाद के साथ अपवाद हैंडलर को बुलबुला नहीं करता है? –

उत्तर

5

सभी टिप्पणियों के लिए धन्यवाद। मैंने रसेल मैकक्लर के सुझाव के रूप में अपना कोड फिर से व्यवस्थित किया, और मैंने सरल परीक्षण के मामलों को बनाने की कोशिश की लेकिन समस्या को पुन: उत्पन्न नहीं कर सका।

अंत में, समस्या बिल्कुल नहीं थी जहां मैं देख रहा था (यह कितनी बार होता है?)।

मेरी पाइपलाइन में, मेरे पास एक डुप्लिकेट संदेश परीक्षक था। मेरे सिस्टम के साथ "संदेश" डील पर दूरस्थ डिवाइस से हैं, और कभी-कभी तार पर संदेश डुप्लिकेट किए जाते हैं।

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

फिक्स डुप्लिकेट चेकर को श्रृंखला में अगले लिंक से आने वाले अपवाद को स्थानांतरित करना था, और रोल-बैक कुछ भी किया गया था।

1

आपकी कतार को प्राप्त करने के लिए आपकी कतार को एक लेनदेन कतार के रूप में बनाया जाना चाहिए।

enter image description here

संपादित करें:

खैर, अपने कतार तो व्यवहार है अगर है कि इस तथ्य के अंक है कि आप अपने लेन-देन mishandling रहे, हालांकि मैं नहीं देख सकते हैं यह विशेष रूप से कैसे हो रहा है। संदेश को वापस करने के लिए मैं आपकी ब्लॉकिंग रीसीव विधि बदल दूंगा। मैं बाहरी विधि में संदेश क्यूयू ट्रान्सएक्शन के निर्माण को स्थानांतरित करूंगा। यदि आपके पास एक ही विधि में आरंभ, Commit और Abort विधि कॉल है तो आपका कोड अधिक रखरखाव योग्य होगा।

+0

हाय! कतार निश्चित रूप से लेनदेन कतार के रूप में बनाई गई हैं। यदि मैं कंप्यूटर प्रबंधन-> सेवाओं और अनुप्रयोगों -> संदेश कतार में कतार गुणों को देखता हूं, यह लेनदेन के रूप में दिखाता है। – JohnCC