3

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

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;
}

Receive 方法将从队列中删除消息。有什么方法可以只读取和删除一些消息吗?

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

还有其他提示吗?

4

1 回答 1

4

有什么方法可以只读取和删除一些消息吗?

我从来没有使用过 MSMQ(反正也没有生气),但我认为你应该能够将PeekReceiveById方法结合起来。

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

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

所以回到你的例子(假设我理解你想要实现的目标)

  • 第一个是您按照描述处理的入站电子邮件提取所有电子邮件,检查它们的添加日期及其优先级
  • 第二个是用于您的出站电子邮件,即一旦您拥有要发送的电子邮件,将其推送到出站队列
于 2012-08-09T12:38:42.280 回答