2014-04-22 208 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)); 

很明顯,你將不得不修改日期東西你的情況相符。

相關問題