2014-04-22 5 views
7

मेरे पास ऐसे संदेश हैं जो कतार में फंस गए हैं और मैं उन्हें प्रोग्रामेटिक रूप से निकालने का एक तरीका ढूंढ रहा हूं।मैं कतार से संदेशों को कैसे हटा सकता हूं?

क्या यह कतार से संदेशों को निकालने का कोई तरीका है यदि यह x दिनों से अधिक समय तक बैठा है? मैं इस तरह की कतार को जोड़ और हटा सकता हूं, लेकिन यह सुनिश्चित नहीं करता कि अलग-अलग संदेशों को कैसे हटाया जाए।

MessageQueue queue = new MessageQueue(@".\private$\SomeTestName"); 
//queue.Purge(); //deletes the entire queue 
try 
{ 
    // Peek and format the message. 
    Message m = myQueue.Peek(); 

    // Display message information. 
    Console.WriteLine("Sent time {0}", m.SentTime); 
    Console.WriteLine("Arrived time {0}", m.ArrivedTime); 
} 
+0

संभव डुप्लिकेट [? संदेश कतार से संदेश को हटाने के लिए कैसे (अपनी अच्छी तरह से केवल इस प्रारूप में अगर)] (http://stackoverflow.com/questions/5115832/how-to -remove-message-from-message-queue-only-if-its-well-formatted) – OldProgrammer

उत्तर

8

ऐसा करने के लिए कोई एपीआई उपलब्ध नहीं है। लेकिन आप उपयोग कर सकते हैं

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

प्रदर्शन बढ़ाने के लिए एक और चाल यह निर्दिष्ट करना है कि कौन से गुण पढ़ना है, ताकि यदि संदेश निकाय बड़ा हो और आप सामग्री में रुचि नहीं रखते हैं, तो आप इसे पढ़ने में अक्षम कर सकते हैं।

var enumerator = _queue.GetMessageEnumerator2(); // get enumerator 
var staleDate = DateTime.UtcNow.AddDays(-3);  // take 3 days from UTC now  
var filter = new MessagePropertyFilter();   // configure props to read 
filter.ClearAll();        // don't read any property 
filter.ArrivedTime = true;      // enable arrived time 
_queue.MessageReadPropertyFilter = filter;  // apply filter 

while (enumerator.MoveNext())  
    if(enumerator.Current.ArrivedTime.Date >= staleDate) 
     enumerator.RemoveCurrent(); 
+0

"GetEnumerator2 संदेश को अस्वीकार नहीं करता है" –

+0

संदेशक्यूयू में removebyid –

+0

कोई समस्या नहीं है :), I इस त्रुटि को प्राप्त करें 'इस पंक्ति पर संदेश प्राप्त करते समय प्रॉपर्टी ArrivedTime पुनर्प्राप्त नहीं किया गया था' अगर (msg.ArrivedTime.Date> = staleDate) 'क्या आपको पता है क्यों? –

0

GetAllMessages पर कॉल करें और अपना संदेश ढूंढने के लिए एक चेक जोड़ें और उस संदेश पर एक डिलीट ऑपरेशन करें। नमूना कोड,

Message[] messages = msgQueue.GetAllMessages(); 
    foreach (Message msg in messages){ 
     doSomething(); 
    } 
1

मुझे लगता है कि आप कुछ इस तरह कर सकते हैं:

MessageQueue queue = new MessageQueue(@".\private$\SomeTestName"); 
var messages = queue.GetAllMessages(); 
var messagesToDelete = messages.Where(m => m.ArrivedTime < DateTime.Now.AddDays(-1)).ToList(); 
messagesToDelete.ForEach(m=>queue.ReceiveById(m.Id)); 

जाहिर है, आप तारीख सामान अपने परिदृश्य के साथ पत्र व्यवहार करने को संशोधित करना होगा।

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