我之前的问题是MSMQ Slow Queue Reading,但是我已经有所进展,现在我认为我更清楚地知道了问题所在。
我的代码(实际上是我正在使用的开源库的一部分)看起来像这样:
queue.Receive(TimeSpan.FromSeconds(10), MessageQueueTransactionType.Automatic);
这里使用Messaging.MessageQueue.Receive函数,队列是一个MessageQueue。问题如下:
以上的代码行将在指定的超时时间(10秒)内调用。Receive(...)函数是一个阻塞函数,应该一直阻塞到队列中有消息到达,此时它将返回消息。如果在超时之前没有收到消息,则会在超时时返回。如果在调用函数时队列中有消息,则会立即返回该消息。
然而,发生的情况是Receive(...)函数被调用后看到队列中没有消息,因此等待新的消息进入。当有新消息到达(在超时之前),它没有检测到这个新消息并继续等待。最终达到超时时间,在这一点上,代码会继续并再次调用Receive(...),在那里它接收消息并处理它。
现在,这个问题只会在几天/几周后出现。我可以通过删除和重新创建队列来让它正常工作。它在不同的计算机和不同的队列上都会发生。因此,似乎某些东西正在逐渐积累,直到某个点打破了
Receive(...)
函数使用的触发/通知能力。我已经检查了很多不同的事情,一切似乎正常,并且与正常工作的队列没有什么不同。磁盘空间充足(剩余13GB),RAM也足够(根据我的估计,1GB中大约有350MB可用)。我已经检查了注册表项,它们都与其他队列相同,性能监视器也没有显示任何异常。我还运行了TMQ工具,也没有发现明显的问题。
我在所有机器上都使用Windows XP,并安装了服务包3。我没有向队列发送大量消息,最多每2秒钟发送1条,但通常比这频率要低得多。消息也很小,远未达到4MB的限制。
我刚刚注意到的唯一一件事是C:\ WINDOWS \ system32 \ msmq \ storage中的p0000001.mq和r0000067.mq文件均为4,096KB,但其他未出现问题的计算机上也是这个大小。该问题并不会同时发生在计算机上的每个队列上,因为我可以在计算机上重现1个问题队列,而其他队列仍然会遇到问题。
我对MSMQ并不是很有经验,如果您发布了可能需要检查的内容,请说明如何检查或在哪里可以找到更多关于您所说的内容的详细信息。
目前的情况是:
- 计算机A - 4个队列正常
- 计算机B - 2个队列出现问题,1个队列正常
- 计算机C - 2个队列出现问题
- 计算机D - 1个队列正常
- 计算机E - 2个队列正常
所以我有很多台计算机/队列需要进行比较和测试。