Mic*_*evy 5 .net msmq message-queue system.messaging messageenumerator
在.NET上的MSMQ中,我使用MessageEnumerator来查看队列中的所有消息.我想删除符合特定条件的邮件.
当我调用MoveNext来逐步执行队列时,我得到一个布尔值来告诉我当前消息是否存在.但是,当我执行RemoveCurrent时,如何知道删除后的当前消息是否存在?检查Current并处理异常的唯一方法是什么?
这是一个示例,我使用简单的条件删除超过一年的消息.假设队列是在别处创建的,并使用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
}
}
}
Run Code Online (Sandbox Code Playgroud)
尽管迟到了:
每次调用 RemoveCurrent() 都会使您的枚举器无效。因此,您需要调用 Reset() 以保持从枚举器(消息队列)的开头开始。
private void RemoveOldMessages(MessageQueue q)
{
MessageEnumerator me = q.GetMessageEnumerator2();
while (me.MoveNext())
{
try
{
Message m = me.RemoveCurrent();
// Handle Message
}
finally
{
me.Reset();
}
}
}
Run Code Online (Sandbox Code Playgroud)