【问题标题】:with MessageEnumerator RemoveCurrent how do I know if I am at end of queue?使用 MessageEnumerator RemoveCurrent 我如何知道我是否在队列末尾?
【发布时间】:2014-03-18 19:30:27
【问题描述】:

在 .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
        }
    }
}

【问题讨论】:

    标签: .net message-queue msmq system.messaging messageenumerator


    【解决方案1】:

    虽然迟到了:

    每次调用 RemoveCurrent() 都会使您的枚举器无效。因此,您需要调用 Reset() 以继续从枚举器(消息队列)的开头开始。

    private void RemoveOldMessages(MessageQueue q)
    {
        MessageEnumerator me = q.GetMessageEnumerator2();
    
        while (me.MoveNext())
        {
            try
            {
                Message m = me.RemoveCurrent();
    
                // Handle Message
            }
            finally
            {
                me.Reset();
            }
        }
    }
    

    【讨论】:

    • 这绝对应该是公认的答案。 MSMQ 文档对此并不清楚,这是我第一次看到这个解决方案。理想情况下,RemoveCurrent 不应增加计数器。
    猜你喜欢
    • 1970-01-01
    • 2020-10-24
    • 2021-11-13
    • 1970-01-01
    • 2020-09-07
    • 2017-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多