我如何从队列中删除邮件?

问题描述 投票:7回答:4

我的邮件被卡在队列中,我正在寻找一种以编程方式删除它们的方法。

如果队列已放置超过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);
}
c# msmq
4个回答
10
投票

没有可用的API来执行此操作。但是你可以使用

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

另一个提高性能的技巧是指定要读取的属性,这样,如果邮件正文很大而您对内容不感兴趣,则可以禁用对其进行读取。

RemoveCurrent()

2
投票

我认为您可以执行以下操作:

OutOfMemoryException

显然,您必须修改日期内容以适合您的方案。


1
投票

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

检查此链接: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();


-1
投票

调用GetAllMessages并添加检查以查找您的消息并对该消息进行删除操作。示例代码,

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));
© www.soinside.com 2019 - 2024. All rights reserved.