【问题标题】:remove a defined number of messages from a message queue从消息队列中删除定义数量的消息
【发布时间】:2014-02-24 08:46:54
【问题描述】:

除了使用.Purge(),有没有办法从队列中删除定义数量的消息?

我尝试设置MessageEnumerator 并使用.RemoveCurrrent,在我对当前消息完成任何我需要做的事情后,但它似乎不起作用。

谢谢

public Message[] Get10(MessageQueue q)
    {

        int counter = 0;
        int mCount = 0;
        List<Message> ml = new List<Message>();
        try
        {
            MessageEnumerator me = q.GetMessageEnumerator2();
            while (me.MoveNext())
            {
                counter++;
            }
            if (counter > 10)
            {
                mCount = 10;
            }
            else
            {
                mCount = counter;
            }
            counter = 0;
            me.Reset();
            do
            {
                me.MoveNext();
                counter++;
                ml.Add(me.Current);
                me.RemoveCurrent();
            } while (counter < mCount);

        }

        catch (Exception x)
        {
            Console.WriteLine(x.Message);
        }
        Message[] m = ml.ToArray();
        return m;
    }

【问题讨论】:

  • 向我们展示一些您尝试过的代码,以便我们更好地帮助您。

标签: c# msmq message-queue


【解决方案1】:

当您调用RemoveCurrent() 时,枚举器将移至下一条消息。在调用RemoveCurrent() 之后,您不必再调用MoveNext()

您可以尝试的另一种方法如下:

    List<Message> ml = new List<Message>();
    int count = 0;

    while(  count < 10 ) {
        ml.Add(me.RemoveCurrent());
        ++count;
    }

在这种情况下,您必须注意,如果队列中没有消息,RemoveCurrent 将永远等待。如果这不是您想要的,您可能需要使用RemoveCurrent(TimeSpan timeout) 重载并捕获在超时情况下抛出的MessageQueueExceptionMessageQueueException 类有一个 MessageQueueErrorCode 属性,如果超时已过期,则该属性设置为 MessageQueueErrorCode.IOTimeout

或者(这将获得最多 10 条消息:如果队列中的消息计数降至零,则循环将退出):

    List<Message> ml = new List<Message>();
    int count = 0;

    while( me.MoveNext() && count < 10 ) {
        ml.Add(queue.ReceiveById(me.Current.Id));
        ++count;
    }

【讨论】:

  • @Theresa 好。请记住,如果队列中的消息少于 10 条,循环将退出 - 基本上,您将 最多 10 条消息出队。如果要等到队列中至少有 10 条消息,则应查看第一个 sn-p。
猜你喜欢
  • 2015-10-18
  • 1970-01-01
  • 2016-09-21
  • 2017-07-22
  • 2014-06-07
  • 2015-12-20
  • 2023-04-06
  • 2018-09-28
  • 1970-01-01
相关资源
最近更新 更多