可用消息最新最好的方式來獲得當前在隊列來處理所有的消息?我怎麼可以得到所有在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