可用消息最新最好的方式来获得当前在队列来处理所有的消息?我怎么可以得到所有在MSMQ队列
我们有大量的非常小的消息,我想这样做的队列中读取当前的所有信息关掉,然后通过处理一个线程池发送。
我似乎无法找到任何很好的资源,它会显示我怎么可以创建一个简单的方法返回一个IEnnumerable例如
感谢
可用消息最新最好的方式来获得当前在队列来处理所有的消息?我怎么可以得到所有在MSMQ队列
我们有大量的非常小的消息,我想这样做的队列中读取当前的所有信息关掉,然后通过处理一个线程池发送。
我似乎无法找到任何很好的资源,它会显示我怎么可以创建一个简单的方法返回一个IEnnumerable例如
感谢
不在于打败队列的目的?队列应该保持消息的顺序,所以你必须循环并继续关闭第一条消息。
虽然我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);
}
对于简单的东西...
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
最新MSMQ的版本还具有以下特点:
你可以在单个对象的消息,如如下:(写自己的“ReceiveCompleted事件”处理程序)
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;
}
你说得对,不幸的是,我并没有参与系统的初始设计,所以我们正在寻找选择,使它更好地使用我们提供的服务 – 2009-08-04 18:43:43