.NET 上の MSMQ では、MessageEnumerator を使用して、キュー内のすべてのメッセージを調べています。特定の条件を満たすメッセージを削除したい。
MoveNext を呼び出してキューをステップスルーすると、現在のメッセージが存在するかどうかを示すブール値が返されます。しかし、RemoveCurrent を実行すると、削除後の現在のメッセージが存在するかどうかをどのように知ることができますか? Current をチェックして例外を処理する唯一の方法はありますか?
これは、1 年以上経過したメッセージを削除するという単純な条件を使用する例です。キューが別の場所で作成され、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
}
}
}