我继承了一个应用程序,它从MSMQ中提取消息对它们进行一些处理,然后根据消息中的内容将一些数据添加到数据库。消息被我无法控制的第三方应用程序推送到队列中。
我对MSMQ了解不多,尽管我对如何使用API有基本的了解。
无论如何,我注意到消息永远不会被删除,我们的客户肯定永远不会删除它们,我可以查看计算机管理并查看服务器上次重启时的消息。
这是错误的吗?当队列达到某个最大大小时,消息会自动被删除吗?或者它们会在那里堆积起来,从而慢慢占用更多内存?
答案 0 :(得分:3)
处理完邮件后,通常会将其从队列中删除(以事务方式或其他方式)。
答案 1 :(得分:1)
我怀疑虽然这不是最佳做法,但重启后会清除队列,只要有足够的可用资源,您就不会遇到问题。
那就是说,我会选择设置一些东西来定期清理队列,这样你就不会淹没服务器。我对MSMQ不太熟悉,但有什么方法可以判断消息是否已被处理?即使它是一个运行的附加服务,检查队列中的消息并查看它们是否已经出现在数据库中,如果它们存在,则删除它们?这样,您就不需要修改您继承的代码库,因为它按原样正常工作。
一旦您决定解决方案,请在此处发布更新 - 我很想知道您最终如何处理此问题。谢谢!
答案 2 :(得分:1)
“无论如何,我注意到这些消息永远不会被删除,我们的客户肯定永远不会删除它们,我可以查看计算机管理并查看服务器上次重启时的消息。”
如果在上次重启之前没有消息,则消息是Express。 Express消息只存储在RAM中而不会持久保存到磁盘,因此重新启动MSMQ服务会破坏它们。这可能是消息量从未达到临界水平的原因。
由于MSMQ使用内核内存和磁盘空间进行内存存储,最终其中一个会放弃并导致服务器稳定性问题,因此您的清理过程计划很好。
干杯, John Breakwell(MSFT)