我有一个消息队列,我在其中添加了一些电子邮件。 我想提取所有电子邮件,检查添加日期和优先级,并只发送其中一个。 我读过这样的消息:
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
还有其他提示吗?
答案 0 :(得分:4)
有没有办法只读取和删除一些消息?
我从来没有使用过MSMQ(反正不是愤怒)但我认为你应该能够将Peek
和ReceiveById
方法结合起来。
因此,您将继续Peek
在队列中查看可用的消息,然后在决定删除消息后使用ReceiveById
来处理/从队列中删除。
除此之外,另一种选择可能是使用2个队列。第一个用于所有入站消息,第二个用于添加要保留的消息。
回到你的例子(假设我明白你想要实现的目标)