如何从队列中删除消息

本文关键字:删除 消息 队列 | 更新日期: 2023-09-27 17:59:27

我有一些消息卡在队列中,我正在寻找一种以编程方式删除它们的方法。

如果队列已放置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);
}

如何从队列中删除消息

没有API可以做到这一点。但是你可以使用

  • GetMessageEnumerator2()
  • RemoveCurrent(),它也移动光标

使用枚举的一个好处是,如果队列有许多消息,则读取所有消息可能会导致OutOfMemoryException。使用枚举器,您一次只能读取一条消息,并且为其分配的内存可以重用。

提高性能的另一个技巧是指定要读取的属性,这样,如果消息正文很大,并且您对内容不感兴趣,则可以禁用读取

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

我认为你可以这样做:

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

显然,您必须修改日期内容以符合您的场景。

您还可以使用ReceiveById方法从队列中删除消息。

查看此链接:https://msdn.microsoft.com/en-us/library/system.messaging.messagequeue.receivebyid%28v=vs.110%29.aspx

调用GetAllMessages并添加一个检查以查找您的消息并对该消息执行删除操作。样本代码,

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