4

パブリック MSMQ が空かどうかを確認する方法はありますか? プライベート MSMQ の場合は簡単です。

private bool IsQueueEmpty(string path)
        {
            bool isQueueEmpty = false;
            var myQueue = new MessageQueue(path);
            try
            {
                myQueue.Peek(new TimeSpan(0));
                isQueueEmpty = false;
            }
            catch (MessageQueueException e)
            {
                if (e.MessageQueueErrorCode == MessageQueueErrorCode.IOTimeout)
                {
                    isQueueEmpty = true;
                }
            }
            return isQueueEmpty;
        }

パブリック MSMQ に対して同じチェックを行うにはどうすればよいですか? 上記のコードでパブリック MSMQ をチェックしようとすると、Peak でエラーが発生します。

System.ArgumentOutOfRangeException: 長さを 0 未満にすることはできません。

4

4 に答える 4

7

メッセージキューの操作を開始したばかりですが、同僚はキューが空かどうかを確認するための次の優れた方法を使用しています。

if (MessageQueue.Exists(fullQueuePath))
{
    // FYI, GetMessageQueue() is a helper method we use to consolidate the code
    using (var messageQueue = GetMessageQueue(fullQueuePath))
    {
        var queueEnum = messageQueue.GetMessageEnumerator2();

        if (queueEnum.MoveNext())
        {
            // Queue not empty
        }
        else
        {
            // Queue empty
        }
    }
}

このメソッドを使用する利点は、例外がスローされないことです。また、タイムアウトが発生するのを待つ必要はないと思います。

于 2011-12-29T13:58:40.777 に答える
5

このPeekメソッドは、直接形式の名前を使用してキューにアクセスする場合にのみ、リモート マシンで使用できます。キューに入れるためにディレクトリ サービスに依存しない限り、同じコードを使用できるはずです。

通常、ダイレクト キュー名は次のようになります。DIRECT=URLAddressSpecification/QueueName

于 2010-09-10T16:18:41.747 に答える
0

レオ、あなたはそれについて確信がありますか?リモート Peek でパス名を使用することはできませんか? 返されたエラーは無効な形式名を示していません。実際、エラーは「isQueueEmpty = false」行にあるように見えます - try/catch はピーク行と isQueueEmpty 行を区別しません。isQueueEmpty 呼び出しは、負の数に変換される例外を受け取っているに違いありません。MSMQ の多くのリモート呼び出しでは、パス名ではなく形式名が必要です。したがって、myQueue の作成にフォーマット名を使用すると、isQueueEmpty が機能するはずです。

乾杯

ジョン・ブレイクウェル

于 2010-09-10T16:52:26.047 に答える