2

我继承了一个从 MSMQ 中提取消息的应用程序,对它们进行一些处理,然后根据消息中的内容将一些数据添加到数据库中。消息被我无法控制的第三方应用程序推送到队列中。

虽然我对如何使用 API 有基本的了解,但我对 MSMQ 了解不多。

无论如何,我注意到这些消息永远不会被删除,我们的客户端肯定不会明确删除它们,我可以查看计算机管理并查看消息回到服务器上次重新启动时。

这是错的吗?当队列达到某个最大大小时,消息是否会开始自动删除,或者它们会永远堆积在那里,慢慢地占用更多内存?

4

3 回答 3

3

处理完消息后,通常会将其从队列中删除(以事务方式或其他方式)。

于 2009-05-11T03:12:29.713 回答
1

我怀疑虽然这不是最佳实践,但队列会在重新启动时被清除,并且只要有足够数量的可用资源,您就永远不会真正遇到问题。

也就是说,我会选择设置一些东西来定期清理队列,这样你就不会压倒服务器。我对 MSMQ 不太熟悉,但是有什么方法可以判断消息是否已被处理?即使它是运行的附加服务,也会检查队列中的消息并查看它们是否已出现在数据库中,如果出现则将其删除?这样,您就不需要修改您继承的代码库,因为它按原样正常工作。

一旦您决定解决方案,请在此处发布更新 - 我很想知道您最终如何处理此问题。谢谢!

于 2009-05-11T02:50:54.507 回答
1

“无论如何,我注意到这些消息永远不会被删除,我们的客户端肯定不会明确删除它们,我可以查看计算机管理并查看消息回到上次重新启动服务器时的消息。”

如果在上次重新启动之前没有消息,则听起来这些消息是 Express。Express 消息仅存储在 RAM 中,不会持久保存到磁盘,因此重新启动 MSMQ 服务将破坏它们。这可能就是为什么消息量从未达到临界水平的原因。

由于 MSMQ 使用内核内存和磁盘空间进行内存存储,最终两者中的一个会失效并导致您的服务器稳定性问题,因此您的清理过程计划是一个很好的计划。

干杯,约翰·布雷克韦尔 (MSFT)

于 2009-06-04T10:56:47.090 回答