【问题标题】:MSMQ:Get the count of messages from MSMQ queue in remote machineMSMQ:从远程机器中的 MSMQ 队列中获取消息计数
【发布时间】:2014-06-24 06:31:11
【问题描述】:

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

本地机器:

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

远程机器:

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

【问题讨论】:

    标签: c# msmq


    【解决方案1】:

    三个选项是:

    1. 目标队列未处于活动状态(即没有消息且未被应用保持打开状态)
    2. 该功能在远程队列上不起作用(虽然我在 MSDN 中找不到特别提到的)
    3. API 调用使用 RPC,而目标计算机正在阻止 RPC 调用。

    Understanding how MSMQ security blocks RPC traffic

    干杯
    约翰

    【讨论】:

    • LOL - 这是帮助我的文章之一! PK :-)
    【解决方案2】:

    试试这个代码..

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

    【讨论】:

      【解决方案3】:
            //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

      【讨论】:

        【解决方案4】:

        这是一个解释的 sn-p,我用于远程和本地队列。不过,您需要正确获取格式名称,这有时会很痛苦。

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

        【讨论】:

          猜你喜欢
          • 2011-08-18
          • 2012-02-12
          • 2013-01-19
          • 1970-01-01
          • 1970-01-01
          • 2012-03-27
          • 2012-05-20
          • 2017-06-16
          • 2012-04-05
          相关资源
          最近更新 更多