How can I remove messages from a queue?

前端 未结 4 1271
-上瘾入骨i
-上瘾入骨i 2021-01-05 05:11

I have messages that get stuck in queue and I am looking for a way to programmatically remove them.

Is there a way to remove messages from a queue if it has been sit

相关标签:
4条回答
  • 2021-01-05 05:51

    I think you can do something like this:

    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));
    

    Obviously, you'll have to modify the date stuff to correspond with your scenario.

    0 讨论(0)
  • 2021-01-05 06:00

    You could also use the ReceiveById method to remove the messages from the queue.

    Check this link out: https://msdn.microsoft.com/en-us/library/system.messaging.messagequeue.receivebyid%28v=vs.110%29.aspx

    0 讨论(0)
  • 2021-01-05 06:01

    There is no API available to do this. But you can use

    • GetMessageEnumerator2() and
    • RemoveCurrent(), which also moves the cursor

    A benefit of using enumeration is that if a queue has many messages, reading all of them may result in OutOfMemoryException. With enumerator you only read 1 message at a time, and memory allocated for it can be reused.

    Another trick to increase performance is to specify which properties to read, so that if the message body is large and you aren't interested in the content, you can disable reading it.

    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
    
    // untested code here, edits are welcome
    while (enumerator.Current != null)    
         if(enumerator.Current.ArrivedTime.Date >= staleDate)
             enumerator.RemoveCurrent();
         else
             enumerator.MoveNext();
    
    0 讨论(0)
  • 2021-01-05 06:08

    Call GetAllMessages and add a check to find your message and do a delete operation on that message. Sample code,

        Message[] messages = msgQueue.GetAllMessages();
        foreach (Message msg in messages){
             doSomething();
        }
    
    0 讨论(0)
提交回复
热议问题