MSMQ - Generic System.Messaging.MessageQueueException - 没有错误消息

时间:2016-12-17 02:05:56

标签: c# .net asynchronous message-queue msmq

我们有一个应用程序,其中有三个独立的MSMQ队列,我们​​正在异步地查看/接收。这些队列不断被偷看(每2秒)以检查新消息。如果一个人成功偷看,它会收到消息以将其拉出队列。 队列在远程服务器上是私有的,客户端在如下路径上连接:     FormatName:DIRECT=OS:servername\Private$\qname

最近,我们的一个环境在尝试查看队列时开始不断接收MessageQueueExceptions。窥视代码看起来像这样:

   var messageQueue = new System.Messaging.MessageQueue(path);
   message = _messageQueue.Peek(_config.QueFetchTimeout);

例外情况如下:

System.Messaging.MessageQueueException (0x80004005)
   at System.Messaging.MessageQueue.MQCacheableInfo.get_ReadHandle()
   at System.Messaging.MessageQueue.StaleSafeReceiveMessage(UInt32 timeout, Int32 action, MQPROPS properties, NativeOverlapped* overlapped, ReceiveCallback receiveCallback, CursorHandle cursorHandle, IntPtr transaction)
   at System.Messaging.MessageQueue.ReceiveCurrent(TimeSpan timeout, Int32 action, CursorHandle cursor, MessagePropertyFilter filter, MessageQueueTransaction internalTransaction, MessageQueueTransactionType transactionType)
   at System.Messaging.MessageQueue.Peek(TimeSpan timeout)
   at Run() in C:\workspace\ourclass.cs:line 53

其他会员价值:

  1. ErrorMessage :(空)
  2. MessageQueueErrorCode:Generic
  3. ErrorCode:-2147467259
  4. 请注意,此异常没有错误消息。我还没有找到任何关于这究竟意味着什么的东西;它似乎只是一种普遍的失败。

    另一个重要的注意事项是,当多个线程在其各自的队列上执行peek时,似乎只会发生此错误。当只有一个队列连续运行时,偷看成功。其他环境没有看到这个问题。这个问题也出现了,并没有对排队代码进行任何更改。

    操作系统的事件日志中没有错误。 EnableConnectionCache为false

    该机器与本地私人队列完美配合。当它们很遥远时,它似乎只是一个问题。

    Windows 2012R2 MSMQ:6.3

    对于可能导致这种情况的原因有什么想法吗?

    更新

    正如OP所说,当只有一个线程在应用程序中运行时,问题不存在。所以下一个显而易见的事情是锁定所有线程之间的peek操作。事实上,这种解决方法解决了这个问题,但是我仍在寻找一个答案,为什么窥视无法处理运行Windows 2012R2的特定机器上的多个线程,以及为什么错误如此无法提供信息

0 个答案:

没有答案