MSMQ:获取远程计算机中MSMQ队列的消息计数

时间:2011-11-21 15:38:47

标签: c# msmq

我正在尝试获取远程计算机中特定专用队列的消息计数。 我可以从我当地的机器上获取计数。

LOCALMACHINE

path=@".\Private$\Sample";

RemoteMachine:

Path=@"RemoteMachineName\Private$\Sample";

完整代码:

当我尝试远程机器路径时,它会抛出错误无效路径。

如果有人可以指导我解决问题,我将不胜感激?

 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));

4 个答案:

答案 0 :(得分:1)

有三种选择:

  1. 目标队列未处于活动状态(即没有消息且未被应用程序保持打开状态)
  2. 函数在远程队列上不起作用(虽然我在MSDN中找不到这个特别称为)
  3. API调用使用RPC,目标计算机阻止RPC调用。
  4. Understanding how MSMQ security blocks RPC traffic

    干杯
    约翰

答案 1 :(得分:1)

试试这段代码..

 MSMQManagement _manager = new MSMQManagement();
 _manager.Init("MACHINE", null, @"DIRECT=OS:MACHINE\PRIVATE$\sample");
 Console.WriteLine(_manager.MessageCount);
 Marshal.ReleaseComObject(_manager);

答案 2 :(得分: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);
      }

在这里,您可以在任何可ping的计算机上获得所有私有msmq消息计数。 让我们首先通过ping来确认机器是否处于活动状态。 如果msmq在.Init方法中有零消息,则会显示错误,因此您可以在try catch和catch set count = 0中使用该语句并且它将被解决(我知道这是错误的方式,但是没有其他方法可以处理那个错误)。 有关更多详细信息,请访问MSDN http://msdn.microsoft.com/en-us/library/ms705997(v=vs.85).aspx

答案 3 :(得分:0)

这是我用于bith远程和本地队列的释义片段。你需要正确地获取格式名称,这有时会很痛苦。

“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 ....