我的消息卡在队列中,我正在寻找一种以编程方式删除它们的方法。
有没有办法从队列中删除超过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 :(得分:9)
没有可用的API来执行此操作。但你可以使用
使用枚举的一个好处是,如果队列有很多消息,那么读取所有消息可能会导致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();
答案 1 :(得分:2)
我认为你可以这样做:
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));
显然,您必须修改日期内容以符合您的方案。
答案 2 :(得分:1)
您还可以使用ReceiveById方法从队列中删除邮件。
答案 3 :(得分:-1)
调用GetAllMessages并添加一个检查以查找您的消息并对该消息执行删除操作。示例代码,
Message[] messages = msgQueue.GetAllMessages();
foreach (Message msg in messages){
doSomething();
}