仅处理来自消息队列的一些消息

时间:2012-08-09 11:43:30

标签: c# .net msmq

我有一个消息队列,我在其中添加了一些电子邮件。 我想提取所有电子邮件,检查添加日期和优先级,并只发送其中一个。 我读过这样的消息:

private IList<Email> GetEmailsFromQueue(MessageQueue queue)
{
    queue.Formatter = new XmlMessageFormatter(new Type[] { typeof(Email) });
    IList<Email> emails = new List<Email>();
    Cursor cursor = queue.CreateCursor();
    Message m = PeekWithoutTimeout(queue, cursor, PeekAction.Current);
    if (m != null)
    {
        emails.Add((Email)m.Body);
        while ((m = PeekWithoutTimeout(queue, cursor, PeekAction.Next)) != null)
        {
            emails.Add((Email)m.Body);
        }
    }
    return emails;
}

private Message PeekWithoutTimeout(MessageQueue q, Cursor cursor, PeekAction action)
{            
    Message msgFromQueue = null;
    try
    {
        msgFromQueue = q.Peek(new TimeSpan(1), cursor, action);
    }
    catch(MessageQueueException ex)
    {
        if (!ex.Message.ToLower().Contains("timeout"))
        {
            throw;
        }
    }
    return msgFromQueue;
}

接收方法将从队列中删除该消息。 有没有办法只读取和删除一些消息?

LE:我想到的一个解决方案是为每条消息添加一个id,并使用ReceiveById

还有其他提示吗?

1 个答案:

答案 0 :(得分:4)

  

有没有办法只读取和删除一些消息?

我从来没有使用过MSMQ(反正不是愤怒)但我认为你应该能够将PeekReceiveById方法结合起来。

因此,您将继续Peek在队列中查看可用的消息,然后在决定删除消息后使用ReceiveById来处理/从队列中删除。

除此之外,另一种选择可能是使用2个队列。第一个用于所有入站消息,第二个用于添加要保留的消息。

回到你的例子(假设我明白你想要实现的目标)

  • 第一个是您按照描述处理的入站电子邮件提取所有电子邮件,检查添加日期及其优先级
  • 第二个是您的出站电子邮件,即一旦您有要发送的电子邮件,将其推送到出站队列