2014-04-22 22 views
7

Ho messaggi che rimangono bloccati in coda e sto cercando un modo per rimuoverli a livello di programmazione.Come posso rimuovere i messaggi da una coda?

C'è un modo per rimuovere i messaggi da una coda se è rimasta per più di x giorni? Posso collegare ed eliminare una coda come questa, ma non sono sicuro di come rimuovere singoli messaggi.

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

possibile duplicato di [? Come rimuovere un messaggio dalla coda di messaggi (solo se la sua ben formattata)] (http://stackoverflow.com/questions/5115832/how-to -remove-message-from-message-solo-code-if-its-well-formatted) – OldProgrammer

risposta

8

Non è disponibile alcuna API per eseguire questa operazione. Ma è possibile utilizzare

Un vantaggio dell'utilizzo di enumerazione è che se una coda ha molti messaggi, la lettura di tutti possono causare OutOfMemoryException. Con l'enumeratore, si legge solo 1 messaggio alla volta e la memoria allocata può essere riutilizzata.

Un altro trucco per aumentare le prestazioni è specificare quali proprietà leggere, in modo che se il corpo del messaggio è grande e non si è interessati al contenuto, è possibile disabilitare la lettura.

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

cosa intendi per "GetEnumerator2 non deseleziona i messaggi?" –

+0

MessageQueue non contiene una definizione per removebyid –

+0

No prob :), I ottenere questo errore 'Proprietà ArrivedTime non è stato recuperato quando si riceve il messaggio' su questa riga' if (msg.ArrivedTime.Date> = staleDate) 'sai perché? –

0

GetAllMessages chiamate e aggiungere un controllo per trovare il tuo messaggio e fanno un'operazione di eliminazione su quel messaggio. Codice di esempio,

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

penso che si può fare qualcosa di simile:

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

Ovviamente, si dovrà modificare la data di roba per corrispondere con lo scenario.

Problemi correlati