パブリックMSMQが空かどうかを確認する方法
-
02-10-2019 - |
質問
パブリック 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:長さはゼロ未満にすることはできません。
解決
Peek
メソッドは、直接形式名を使用してキューにアクセスする場合にのみリモートマシンで使用できます。キューに到達するためにディレクトリサービスに依存していない限り、同じコードを使用できるはずです。
通常、直接キュー名は次のように見えます。 DIRECT=URLAddressSpecification/QueueName
他のヒント
私はメッセージのキューを使用し始めたばかりですが、私の同僚は、キューが空であるかどうかをチェックするためのこの良い方法を持っています。
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
}
}
}
この方法を使用することの利点は、例外を投げかけないことであり、タイムアウトが発生するのを待つ必要はないと思います。
レオ、本当にそうですか?リモート Peek ではパス名を使用できないのですか?返されるエラーには無効な形式名は示されていませんが、無効な形式名である場合はそれが予想されるものです。実際、エラーは「isQueueEmpty = false」行にあるようです。try/catch はピーク行と isQueueEmpty 行を区別しません。isQueueEmpty 呼び出しが、負の数に変換される例外を受け取っているに違いありません。ただし、今の解決策は正しいかもしれません。MSMQ のリモート呼び出しの多くは、パス名ではなく形式名を必要とします。したがって、myQueue の作成に形式名を使用する場合は、isQueueEmpty が機能するはずです。
乾杯
ジョン・ブレークウェル