4

失敗している MSMQ のカウントを取得するための呼び出しがあります。

いくつかの調査の後、私はこの質問を見つけました: ruby​​ で MSMQ メッセージ数を読む

そこの答えは、キューが空でクローズされている場合、「パフォーマンスメトリック」(メッセージ数を含む)を取得できないことを示しています。

私の質問は、.NET と C# を使用して MSMQ をプログラムで「開く」(つまり「閉じる」) 方法を教えてください。


更新:関連する場合は、メッセージ数を取得するためのコードを次に示します。

private static int GetMessageCount(string queueName, string machine)
{
    MSMQManagement queue = new MSMQManagement();

    string formatName = @"DIRECT=OS:" + machine + @"\PRIVATE$\" + queueName;
    queue.Init(machine, null, formatName);
    return queue.MessageCount;
}

でエラーが発生しqueue.Initます。エラー メッセージは次のとおりです。「キューが開いていないか、存在しない可能性があります。」

このコードは、まったく同じように設定されている (ただし空ではない) 別のキューでも問題なく機能します。

4

2 に答える 2

5

「キューが開いていません」というエラーを回避するには、標準の msmq 呼び出しを使用してキューを開き、短いタイムアウトでメッセージを確認します。「要求された操作のタイムアウトが期限切れになりました」というタイムアウト例外をキャッチする必要があります。ただし、タイムアウト後、メッセージが 0 であっても、MSMQManagement オブジェクトを使用してキューをクエリできます。

        MSMQ.MSMQApplication q = new MSMQ.MSMQApplication();
        object obj = q.ActiveQueues;
        foreach (object oFormat in (object[])q.ActiveQueues)
        {
            object oMissing = Type.Missing;
            object oMachine = System.Environment.MachineName;
            MSMQ.MSMQManagement qMgmt = new MSMQ.MSMQManagement();
            object oFormatName = oFormat; // oFormat is read only and we need to use ref
            qMgmt.Init(ref oMachine, ref oMissing, ref oFormatName);
            outPlace.Text += string.Format("{0} has {1} messages queued \n", oFormatName.ToString(), qMgmt.MessageCount.ToString());
        }
        foreach (object oFormat in (object[])q.PrivateQueues)
        {
            object oMissing = Type.Missing;
            object oMachine = System.Environment.MachineName;
            MSMQ.MSMQManagement qMgmt = new MSMQ.MSMQManagement();
            queue = new MessageQueue(oFormat.ToString());
            object oFormatName = queue.FormatName; // oFormat is read only and we need to use ref
            TimeSpan timeout=new TimeSpan(2);
           try
           {
                Message msg = queue.Peek(timeout);
            }
            catch
            {// being lazy and catching everything for this example
            }
            qMgmt.Init(ref oMachine, ref oMissing, ref oFormatName);
              outPlace.Text += string.Format("{0}  {1} {2}\n", oFormat.ToString(), queue.FormatName.ToString(), qMgmt.MessageCount.ToString());
        }
    }
于 2014-05-14T19:25:53.570 に答える
0

キュー内のメッセージ数を取得する別の方法は、MessageQueue クラスの GetAllMessages メソッドを使用することです。キュー内のすべてのメッセージの静的スナップショットである Message[] を返します。その後、長さパラメーターを読み取ってメッセージの数を取得できます。

msdn リンクは次のとおりです: http://msdn.microsoft.com/en-gb/library/system.messaging.messagequeue.getallmessages.aspx

于 2013-04-17T14:05:24.053 に答える