2014-04-22 176 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

没有可用的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(); 
+0

你是什么意思?“GetEnumerator2不出列消息? –

+0

MessageQueue不包含removebyid的定义 –

+0

没有问题:),I得到这个错误'当在这一行接收到消息'时没有检索到属性ArrivedTime'if(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)); 

很明显,你将不得不修改日期东西你的情况相符。

相关问题