[英]how can i get all the available messages on a MSMQ Queue
什么是獲取當前隊列中的所有消息進行處理的最佳方法?
我們有一個包含大量非常小的消息的隊列,我想要做的是讀取所有當前消息,然后通過線程池發送它們進行處理。
我似乎無法找到任何好的資源,它將告訴我如何創建一個簡單的方法來返回IEnnumerable例如
謝謝
雖然我同意Nick的看法,隊列的目的更多是用於FIFO樣式處理,而ArsenMkrt的解決方案也可以使用,另一個選擇是使用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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.