2011-11-21 125 views
1

我正在嘗試獲取遠程計算機中特定專用隊列的消息數。 我可以從我的本地計算機獲取計數。MSMQ:從遠程計算機的MSMQ隊列中獲取消息的計數

LOCALMACHINE

RemoteMachine:

[email protected]"RemoteMachineName\Private$\Sample"; 

全碼:

當我嘗試遠程機器路徑,它拋出第我e錯誤無效路徑。

如果有人能指導我解決問題,我將不勝感激?

var path ="FormatName:Direct=OS:RemoteMachineName\\private$\\sample"; 

MessageQueue queuename = new MessageQueue(path); 
var mgmt = new MSMQManagement(); 
object machine = "RemoteMachineName"; 
object queuename = queue.Path;   
object formatname = "Direct=OS"; 
mgmt.Init(ref machine, ref queuename, ref formatname); 
int messageCount = mgmt.MessageCount; 
MessageBox.Show(string.Format("Queue has {0} items", messageCount)); 

回答

1

有三個選項:

  1. 目標隊列不活動狀態(即,沒有任何消息,而不是通過一個應用程序保持打開)
  2. 功能無法在遠程隊列工作(儘管我無法在MSDN中找到此具體名稱)
  3. API調用使用RPC,目標機器阻止RPC調用。

Understanding how MSMQ security blocks RPC traffic

乾杯
約翰

+0

大聲笑 - 這是幫助我的文章之一! PK :-) –

0

試試這個代碼..

MSMQManagement _manager = new MSMQManagement(); 
_manager.Init("MACHINE", null, @"DIRECT=OS:MACHINE\PRIVATE$\sample"); 
Console.WriteLine(_manager.MessageCount); 
Marshal.ReleaseComObject(_manager); 
0
 //strHostName is Machine name/IP from which you have to get queue 
     //MSMQManagement present in COM library which is present at "C:\Program Files (x86)\Microsoft SDKs\Windows" 
     PrivateQueueList = MessageQueue.GetPrivateQueuesByMachine(strHostName); 
     int count = PrivateQueueList.Count(); 
     MSMQManagement QueueManagement = new MSMQManagement[count]; 
     MSMQManagement msmq = null;  
     int index = 0; 
     foreach(var queue in PrivateQueueList) 
     { 
      msmq = new MSMQManagement();   
      object machine = queue.MachineName; 
      object path = null; 
      object formate=queue.FormatName; 
      msmq.Init(ref machine, ref path,ref formate); 
      QueueManagement[index] = msmq;         
      index++; 
     } 
     foreach(var queue in QueueManagement) 
     { 
      int count= queue.MessageCount(); 
      Console.WriteLine(queue.QueueName+ " ="+ count); 
     } 

在這裏,你得到的所有私人MSMQ消息計數在任何機器是平能。 首先通過ping確認機器是否處於活動狀態。 有錯誤顯示如果msmq在.Init方法中有零消息,所以你可以在try catch和catch set count = 0中使用該語句,它會被解決(我知道這是錯誤的方式,但沒有其他方法以處理該錯誤)。 欲瞭解更多詳情,您可以訪問MSDN http://msdn.microsoft.com/en-us/library/ms705997(v=vs.85).aspx

0

這是一個解釋片段,我用於遠程和本地隊列。你需要獲得格式名稱,但有時候這可能是一種痛苦。

「msmqManagement.Init」下面的參數對我來說不同於你的例子,可能試試。

提示 - 發佈實際的異常跟蹤,它有所不同。我認爲你沒有得到「錯誤無效路徑」,堆棧跟蹤會爲你提供線索,例如計算機名解析問題等

MessageQueue mq = new MessageQueue(path); 
var formatName = mq.FormatName; 
var msmqManagement = new MSMQManagement(); 
msmqManagement.Init(machineName, null, formatName); 
var messageCount = msmqManagement.MessageCount; 
Marshal.ReleaseComObject(msmqManagement); 

同樣 - 狀態是什麼版本的MSMQ您使用的是....

相關問題