我们有一个应用程序,其中有三个独立的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
其他会员价值:
请注意,此异常没有错误消息。我还没有找到任何关于这究竟意味着什么的东西;它似乎只是一种普遍的失败。
另一个重要的注意事项是,当多个线程在其各自的队列上执行peek时,似乎只会发生此错误。当只有一个队列连续运行时,偷看成功。其他环境没有看到这个问题。这个问题也出现了,并没有对排队代码进行任何更改。
操作系统的事件日志中没有错误。 EnableConnectionCache为false
该机器与本地私人队列完美配合。当它们很遥远时,它似乎只是一个问题。
Windows 2012R2 MSMQ:6.3
对于可能导致这种情况的原因有什么想法吗?
更新
正如OP所说,当只有一个线程在应用程序中运行时,问题不存在。所以下一个显而易见的事情是锁定所有线程之间的peek操作。事实上,这种解决方法解决了这个问题,但是我仍在寻找一个答案,为什么窥视无法处理运行Windows 2012R2的特定机器上的多个线程,以及为什么错误如此无法提供信息