2011-09-23 41 views
1

我有一個Windows服務使用NServiceBus來處理傳入的消息。 在處理消息時,我想檢查隊列上是否有其他剩餘消息要處理。 解決這個問題的最好方法是什麼?在處理NServiceBus消息時,是否可以查看輸入隊列?

+0

斯科特出於好奇,爲什麼你關心,如果其他消息隊列? –

+0

我有一個處理程序將消息轉換爲電子表格的行,以便上載到遺留系統。 (一條消息=一行)。我不想將電子表格移到上傳文件夾,直到隊列中沒有更多消息。即我想上傳一個大的電子表格,而不是1000行的一行電子表格。 –

+0

處理這種情況的另一種方法是將每條消息「票證」,例如10箇中的1個,10箇中的2個等。這顯然必須在發送方一側完成。 –

回答

4

對於這個特定的場景,我會說一個傳奇可能是合適的,它通過收到的第一條消息創建,打開一個超時(讓我們說一分鐘),在那段時間收集所有消息,然後總線.SendLocal包含所有行的消息,爲此另一個處理程序創建電子表格並上傳。

+0

這聽起來很不錯,謝謝。但是,即使在一個傳奇中,知道隊列中是否還有更多消息會很有用。在這個系統中,郵件分批發送,每次數千個,然後幾個小時都沒有。理想情況下,我不想開始電子表格的創建和上傳,直到我從該批次中收集了來自總線的所有消息。 關於在隊列中窺視的任何建議?或者出於某種原因,這只是一個非常糟糕的主意? –

+0

然後,如果自上次超時後收到任何消息,並且只發送信息,則可以使用超時方法檢查事務。 –

1

因爲,NServiceBus使用的是MSMQ,所以您可以使用System.Messaging中的方法。 包括一個修改的方法,我目前正在進行一種批處理。

using System.Messaging; 

public int PeekAtQueue() 
{ 
    const string QUEUE_NAME = "private$\\you_precious_queuname"; 

    if (!MessageQueue.Exists(".\\" + QUEUE_NAME)) 
     return 0; 

    var messageQueues = MessageQueue.GetPrivateQueuesByMachine(Environment.MachineName); 
    var queue = messageQueues.Single(x => x.QueueName == QUEUE_NAME); 
    return queue.GetAllMessages().Count(); 
} 

在編輯器中自己修改。希望它仍然編譯:) 這裏發現了類似的討論,順便說一句:

http://jopinblog.wordpress.com/2008/03/12/counting-messages-in-an-msmq-messagequeue-from-c/

相關問題