System.InvalidOperationException: 实例"[专用队列路径]"在指定的类别中不存在



我使用以下代码获取消息 此方法的队列计数每 15 秒调用一次

public JObject GetQueueItemsCount()
{
               JObject returnObject = new JObject();
                int queueCount = 0;
                var queueName = @"" + ConfigurationManager.AppSettings["QueueName"];
                try
                {
                    MessageQueue messageQueue = new MessageQueue(queueName);
                    if (MessageQueue.Exists(queueName))
                    {
                        var queueCounter = new PerformanceCounter("MSMQ Queue", "Messages in Queue", queueName, @"" + ConfigurationManager.AppSettings["MachineName"]);
                        queueCount = (int)queueCounter.NextValue();
                    }

                }
                catch (Exception ex)
                {
                    throw ex;
                }
                finally {
                    returnObject.Add("queueCount", queueCount);
                }
                return returnObject;
            }

问题是有时会抛出以下异常:并且当新创建的队列的消息队列计数基本上变为 0 时,会抛出此异常

System.InvalidOperationException: Instance 'xxxxxprivate$xxx_queue' does not exist in the specified Category.
  at xxxxx.BusinessObjects.ControllerRepositories.xxxxRepository.GetQueueItemsCount()
  at lambda_method(Closure , Object , Object[] )
  at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass10.<GetExecutor>b__9(Object instance, Object[] methodParameters)
  at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary`2 arguments, CancellationToken cancellationToken)
------
我相信这是因为

性能计数器要么还不存在(对于从未有任何消息的新队列(,要么已被删除。 由于您无论如何都要实例化 MessageQueue 对象,因此获取计数的更可靠方法可能是调用 messageQueue.GetAllMessages().Length 。 只要没有在 MessageQueuePropertyFilter 中启用 Body 属性,它就不应该非常昂贵。

最新更新