什么是获取队列中当前所有消息的最佳方法?
我们有一个包含大量非常小的消息的队列,我想要做的是读取所有当前消息,然后通过线程池发送它们进行处理。
我似乎无法找到任何好的资源,它会告诉我如何创建一个简单的方法来返回IEnnumerable例如
由于
答案 0 :(得分:9)
虽然我同意Nick队列的目的更多是FIFO样式处理,ArsenMkrt's解决方案可行,但另一个选择是使用MessageEnumerator并将消息堆积到IEnumerable中
var msgEnumerator = queue.GetMessageEnumerator2();
var messages = new List<System.Messaging.Message>();
while (msgEnumerator.MoveNext(new TimeSpan(0, 0, 1)))
{
var msg = queue.ReceiveById(msgEnumerator.Current.Id, new TimeSpan(0, 0, 1));
messages.Add(msg);
}
答案 1 :(得分:2)
对于简单的东西......
public void DoIt()
{
bool continueToSeekForMessages = true;
while (continueToSeekForMessages)
{
try
{
var messageQueue = new System.Messaging.MessageQueue(@"FormatName:Direct=OS:MyComputerNameHere\Private$\MyPrivateQueueNameHere");
var message = messageQueue.Receive(new TimeSpan(0, 0, 3));
message.Formatter = new System.Messaging.XmlMessageFormatter(new String[] { "System.String,mscorlib" });
var messageBody = message.Body;
}
catch (Exception ex)
{
continueToSeekForMessages = false;
}
}
}
此外,可以使用peek而不是将消息从队列中删除。
另外,可以使用GetMessageEnumerator2
答案 2 :(得分:0)
这不会破坏队列的目的吗?队列应该保持消息的顺序,所以你必须循环并继续拉出第一个消息。
答案 3 :(得分:0)
最新版本的MSMQ还具有以下功能:
您可以在单个对象中获取所有消息,如下所示:(编写您自己的&#34; ReceiveCompleted事件&#34;处理程序)
private static void MyReceiveCompleted(Object source,
ReceiveCompletedEventArgs asyncResult)
{
MessageQueue mq = (MessageQueue)source;
try
{
Message[] mm = mq.GetAllMessages();
foreach (Message m in mm)
{
// do whatever you want
}
}
catch (MessageQueueException me)
{
Console.WriteLine(me.Message);
}
finally
{
}
return;
}