Как вы можете прочитать счет MSMQ на другой машине? - PullRequest
1 голос
/ 27 июля 2010

Моя программа успешно использует класс MessageQueue .NET для чтения из MSMQ. Очередь настраивается пользователем, иногда на локальной машине, а иногда на удаленной машине. Пользователь может указать удаленную машину либо по имени или IP-адресу, либо по имени очереди (а я использую только «личные» очереди).

Я хочу показать пользователю, сколько сообщений осталось в очереди, но не нашел способа сделать это. Класс MessageQueue, по-видимому, не имеет свойства Count (или подобного), чтобы легко дать мне его.

Мне удалось использовать классы PerformanceCounter и PerformanceCounterCategory, чтобы получить счетчик - но мне кажется, что это работает только на локальной машине (хотя я не совсем уверен, что использую эти классы правильно).

У меня вопрос, как прочитать количество (количество сообщений) из MSMQ на удаленной машине?

Ответы [ 6 ]

4 голосов
/ 14 сентября 2011

Я использую следующий метод подсчета сообщений (работает как для локальных, так и для удаленных очередей),

        var machineName = "mymachine01";
        var formatName = "FormatName:DIRECT=OS:mymachine01\private$\ftpreceived":
        try
        {
            var msmqManagement = new MSMQ.MSMQManagement();
            msmqManagement.Init(machineName, null, formatName );
            return (uint)msmqManagement.MessageCount;
        }
        catch (COMException ex)
        {
            // If queue is not active or does not exist.
            if (ex.ErrorCode == -1072824316)
            {
                return 0;
            }

            throw;
        }

Примечание. Возвращает 0 в случае, если очередь не существует или не активна в качестве MSMQ.API управления считает, что это та же ошибка.

Примечание. Если значение имени компьютера равно нулю, оно будет смотреть на очередь на локальном компьютере.

Примечание. Если переменная имени устройства отличается отимя_карты, являющееся частью имени формата, будет возвращать количество сообщений в очереди «Исходящих» сообщений с заданным именем формата на компьютере, указанном в имени_хин.в течение последних N секунд в нем было сообщение (не уверен, насколько велико N :)), после этого время очередь считается неактивной.

3 голосов
/ 20 августа 2010

Наиболее надежным решением для подсчета количества сообщений в локальной очереди является использование API-интерфейсов MSMQ с использованием P / Invoke. Здесь есть хорошая статья: Подсчет количества сообщений в очереди сообщений в .NET .

Я не знаю, работает ли это с удаленными очередями, но я бы не стал полагаться на это. Как правило, единственное, что вам нужно сделать с удаленной очередью, это отправить сообщение. Попытки чтения сообщений или свойств из удаленной очереди следует избегать, если это возможно. «Отправлять удаленно и читать локально» всегда обеспечивает наилучшую производительность и позволяет избежать всевозможных проблем (например, что если удаленный компьютер недоступен?)

1 голос
/ 06 мая 2013

Я использую WMI для получения этой информации. Ниже приведен пример кода, который я использую для этого.

            var query = String.Format("select MessagesinQueue from Win32_PerfRawdata_MSMQ_MSMQQueue where name ='{0}'", path.Replace("\\", "\\\\"));
        var selectQuery = new SelectQuery(query);
        using (var searcher = new ManagementObjectSearcher(selectQuery))
        using (var results = searcher.Get())
        {
            foreach (var result in results)
            {
                var messages = result["MessagesinQueue"].ToString();
                return long.Parse(messages);
            }
        }
0 голосов
/ 29 июля 2010

Я хотел бы сказать несколько вещей здесь.

  • Прежде чем я получу свой собственный ответ, я хотел бы прокомментировать решение Джона Опнакара (в ответе ученика доктора Вилли). Его код работает на удаленных машинах. Я использовал его код в нашем проекте на работе, чтобы наблюдать за очередями на удаленном кластерном сервере, и он работает очень хорошо .

  • Итак, если вы получаете ошибки «RemoteMachineNotAvailable», пожалуйста, проверьте ваши настройки. Все ли машины находятся в одной сети или - не стоит забывать - настроены ли права доступа в очереди на удаленной машине, чтобы другие могли их читать? Имеют ли пользователи / учетные записи достаточные права для чтения из других систем?

Например, мы должны были разрешить всем в кластеризованных очередях.

  • Насколько я знаю, у PerformanceCounters действительно есть проблемы с чтением свойств сообщений на удаленных машинах. Я пытался использовать их для очередей в кластерной среде Windows Server, но так и не смог заставить его работать. В то время я проводил некоторые интернет-исследования, но, к сожалению, я не помню, связано ли это с соображениями безопасности или просто с ошибкой. : - (

  • Теперь к фактическому ответу. Если вам не нравится метод Cursor-Method, описанный Джоном Опинкаром, вы также можете использовать методы MessageQueue.GetAllMessages () или MessageQueue.GetMessageEnumerator .

Я никогда не пробовал GetMessageEnumerator, но могу сказать, что я бы не рекомендовал GetAllMessages ().

Мы страдали от серьезных проблем с производительностью при использовании каждую секунду в системе с несколькими очередями, которые содержат несколько тысяч сообщений. Метод делает снимок всех сообщений в очереди, что может вызвать большие нагрузки в памяти и сети.

Метод курсора все еще несколько медленный. Но, по крайней мере, в нашей производственной среде он выглядит более быстрым, чем с решением GetAllMessages ().

Если подсчет сообщений в вашем сценарии необязательно должен составлять одну секунду и у вас меньше сообщений для подсчета, чем у нас, тогда работа с GetAllMessages () или GetMessageEnumerator () может оказаться для вас возможным решением.

Наконец, это всегда сводится к вашим собственным индивидуальным потребностям.

0 голосов
/ 28 июля 2010

Это может быть излишним, но вы можете разместить службу WCF на том же компьютере, где размещена ваша очередь, так что вы сможете получить счетчик с помощью счетчиков производительности в службе WCF и раскрыть эту функциональность с помощью методаэтот сервис.

0 голосов
/ 28 июля 2010
...