2014-04-22 15 views
7

Mam wiadomości, które utknęły w kolejce i szukam sposobu, aby je programowo usunąć.Jak mogę usunąć wiadomości z kolejki?

Czy istnieje sposób na usunięcie wiadomości z kolejki, jeśli trwa dłużej niż X dni? Mogę połączyć i usunąć kolejkę podobną do tej, ale nie wiem, jak usunąć poszczególne wiadomości.

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

możliwe duplikat [? Jak usunąć komunikat z kolejki komunikatów (tylko jeśli jej dobrze sformatowany)] (http://stackoverflow.com/questions/5115832/how-to -remove-message-from-message-queue-only-if-its-well-formatted) – OldProgrammer

Odpowiedz

8

Nie można tego zrobić za pomocą interfejsu API. Ale można użyć

Zaletą korzystania wyliczenie jest to, że jeśli kolejka ma wiele wiadomości, czytając wszystkie z nich mogą spowodować OutOfMemoryException. Z modułem wyliczającym można odczytać tylko 1 wiadomość naraz, a pamięć przeznaczona na to może być ponownie wykorzystana.

Inną sztuczką zwiększającą wydajność jest określanie właściwości do odczytania, więc jeśli treść wiadomości jest duża i nie interesuje Cię zawartość, możesz wyłączyć jej odczytanie.

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

co masz na myśli przez "GetEnumerator2 nie piszczy wiadomości? –

+0

MessageQueue nie zawiera definicji dla removebyid –

+0

Brak prob :), I get this error 'Nieruchomość ArrivedTime nie została pobrana podczas odbierania wiadomości' w tym wierszu' if (msg.ArrivedTime.Date> = staleDate) 'czy wiesz dlaczego? –

0

Zadzwoń GetAllMessages i dodaj czek, aby znaleźć swoją wiadomość i wykonaj operację usunięcia tej wiadomości. Przykładowy kod,

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

myślę, że można zrobić coś takiego:

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

Oczywiście, trzeba będzie zmodyfikować datę rzeczy dla odpowiedniego scenariusza.

Powiązane problemy