2009-09-22 3 views
1

COM을 사용하면 큐의 MessageCount 속성을 가져올 수 있습니다. MSMQ.Interop을 사용하여 동일한 작업을 수행 할 수 있지만 순수한 .NET 방식으로이 작업을 수행 할 수있는 방법이 있는지 궁금합니다..NET의 MSMQ 대기열에서 MessageCount를 어떻게 받습니까?

+0

불행히도 Microsoft는 여기서 불쾌하고 MessageQueue.MessageCount 속성을 구현하는 것을 잊었습니다. .NET의 유일한 API는 .GetAllMessages() 메소드이지만 대기열에 수만 개의 메시지가 있으면 성능이 매우 떨어집니다. 현재 유일한 선택은 WMI, COM 또는 카운터를 증가시키면서 메시지를 열거하고 엿볼 수있는 고유 한 사용자 지정 기술을 구현하는 것입니다. 몇 가지 대안은 여기에 언급 : http://stackoverflow.com/questions/3869022/is-there-a-way-to-check-how-many-messages-are-in-a-msmq-queue –

답변

0

물론, 사용 WMI :

Select * From Win32_PerfRawData_MSMQ_MSMQQueue 
+0

불행히도 이것을 사용하면 메소드에서 대기열 이름이 64 문자로 잘 리면이 옵션을 사용할 수 없도록 만들 수 있습니다. 참조 : http://connect.microsoft.com/VisualStudio/feedback/details/91525/system-daignostics-performancecounter-fails-when-using-instance-name-64-characters –

0

물론! 이 개인 큐 내부 메시지를 계산하는 가장 빠른 방법은 빠르고

  int Total = 0; 
      using (var queue = new MessageQueue("queue_name", QueueAccessMode.ReceiveAndAdmin)) 
      { 
       Total = (from Message msg in queue 
         select msg).Count(); 
      } 
0

간단 LINQ를 사용할 수 있습니다.

//using System.Diagnostics 
    int messageCount =0; 
    private MessageQueue[] privatequeuelist = MessageQueue.GetPrivateQueuesByMachine(Dns.GetHostName()); 
    foreach(var Queue in MessageQueue) 
    { 
     string fullyQualifiedQueueName = string.Format(@"{0}\{1}", Environment.MachineName, Queue.QueueName); 
     PerformanceCounterCategory category = new PerformanceCounterCategory("MSMQ Queue"); 
     PerformanceCounter cntr = new PerformanceCounter("MSMQ Queue", "Messages in Queue"); 
     if (category.InstanceExists(fullyQualifiedQueueName.ToLower())) 
      { 
       cntr.InstanceName = fullyQualifiedQueueName.ToLower(CultureInfo.CurrentCulture); 
       messageCount = (int)cntr.NextValue(); 
      } 
     Console.WriteLine(Queue.QueueName + "===" + messageCount); 
    } 
    Console.ReadLine(); 
관련 문제