In MSMQ unter .NET verwende ich einen MessageEnumerator, um alle Nachrichten in der Warteschlange zu durchsuchen. Ich möchte Nachrichten entfernen, die eine bestimmte Bedingung erfüllen.mit MessageEnumerator RemoveCurrent Wie kann ich wissen, ob ich am Ende der Warteschlange bin?
Wenn ich MoveNext aufrufen, um durch die Warteschlange zu gehen, bekomme ich einen Boolean zurück, um mir zu sagen, ob die aktuelle Nachricht existiert. Aber wenn ich einen RemoveCurrent mache, woher weiß ich, ob die aktuelle Nachricht nach dem Entfernen existiert? Ist die einzige Möglichkeit, Current zu überprüfen und die Ausnahme zu behandeln?
Hier ist ein Beispiel, wo ich die einfache Bedingung der Entfernung von Nachrichten verwenden, die über ein Jahr alt sind. Angenommen, die Warteschlange wurde an anderer Stelle erstellt und festgelegt mit MessageReadPropertyFilter.ArrivedTime = true:
private void RemoveOldMessages(MessageQueue q)
{
MessageEnumerator me = q.GetMessageEnumerator2();
bool hasMessage = me.MoveNext();
while (hasMessage)
{
if (me.Current.ArrivedTime < DateTime.Now.AddYears(-1))
{
Message m = me.RemoveCurrent(new TimeSpan(1));
// Removes and returns the current message
// then moves to the cursor to the next message
// How do I know if there is another message? Is this right?:
try
{
m = me.Current;
hasMessage = true;
}
catch (MessageQueueException ex)
{
hasMessage = false;
}
}
else
{
hasMessage = me.MoveNext();
// MoveNext returns a boolean to let me know if is another message
}
}
}
Dies sollte definitiv die akzeptierte Antwort sein. Die MSMQ-Dokumentation ist dazu nicht klar und dies ist das erste Mal, dass ich diese Lösung gesehen habe. Im Idealfall sollte RemoveCurrent den Zähler nicht erhöhen. –