2017-08-15 59 views
0

所以我正在爲我的一臺服務器上安裝的消息隊列編寫一個看門狗。我有一個正在隊列中偵聽並處理消息的應用程序(第三方)。我現在想要對它進行計數,如果信息到達示例1500,我會發送一封電子郵件。所以我所有的代碼都可以工作,除了我需要關閉第三方應用程序才能使用消息隊列。我所做的是獲取所有存在的隊列名稱。工作正常。c#消息消息隊列計數。 - 由於隊列被打開而導致的共享衝突已被獨佔接收

public void GetPrivateQueues() 
{ 
    MessageQueue[] QueueList = 
    MessageQueue.GetPrivateQueuesByMachine("."); 

    foreach (MessageQueue queueItem in QueueList) 
    { 
     i++; 

     myPrivateQueues.Add(queueItem.Path); 

     Count(queueItem.Path); 
    } 

    return; 
} 

所以,當我做隊列的計數這樣

public void Count(String path) 
{ 

    MessageQueue queue = new MessageQueue(path); 
    MessageEnumerator messageEnumerator = queue.GetMessageEnumerator2(); 
    int iii = 0; 
    while (messageEnumerator.MoveNext()) 
    { 
     iii++; 
    } 

    myPrivateQueuesCount.Add(iii); 
    return;//i; 
} 

我得到的錯誤。

System.Messaging.MessageQueueException(0x80004005):由於隊列已被打開而導致共享衝突,以致於獨佔接收。

我該如何去閱讀隊列來進行計數而不試圖獲得對它的獨佔訪問。我只需要數一數。

謝謝

問候

+0

你試過Peek嗎?但是要實現你想要的,你可能會更好地使用隊列名稱和性能計數器:https://stackoverflow.com/a/13139144/474702 – reckface

+0

是的。我剛回到這裏更新併發布答案。我確實使用了性能計數器。所以我得到隊列名稱。修剪它,使其與性能計數器匹配,並且正在工作。 –

回答

0

我使用性能計數器來讀取隊列。 現在就像做夢一樣!

添加了catch異常。這是當隊列空白時。我寫一個0.性能計數器在空白隊列上給出錯誤。

 public void Count(String path) 
    { 

      path = path.Remove(0, 21); 

     try 
     { 
      PerformanceCounter queueCounter = new PerformanceCounter(
      "MSMQ Queue", 
      "Messages in Queue", 
      @path); 


      Console.WriteLine("Queue contains {0} messages", 
       queueCounter.NextValue().ToString()); 
      myPrivateQueuesCount.Add((int)queueCounter.NextValue()); 

     } 
     catch (Exception exc) 
     { 
      myPrivateQueuesCount.Add(0); 
     } 

     return; 
    } 
+0

供參考。我做了第二個函數來計算和更新每個計數的數組。被稱爲Recount –