MSMQ:从队列接收时,啥会导致“资源不足以执行操作”错误?

Posted

技术标签:

【中文标题】MSMQ:从队列接收时,啥会导致“资源不足以执行操作”错误?【英文标题】:MSMQ: What can cause a "Insufficient resources to perform operation" error when receiving from a queue?MSMQ:从队列接收时,什么会导致“资源不足以执行操作”错误? 【发布时间】:2010-12-16 11:50:34 【问题描述】:

MSMQ:从队列接收时,什么会导致“资源不足以执行操作”错误?

当时队列只保存 2,000 条消息,每条消息的大小约为 5KB。

【问题讨论】:

您可能会泄漏资源(内存、句柄等)。 我同意,手柄是我的赌注。什么操作系统? 【参考方案1】:

来自 John Breakwell 的博客有十一种可能性:

    用于远程读取的线程池已用尽(仅限 MSMQ 2.0)。 超过本地回调线程数 消息量已超过 系统可以处理什么(MSMQ 2.0 仅)。 分页池内核内存是 筋疲力尽。 二进制文件不匹配。 邮件过大。 已超出计算机配额。 打开一个路由时出现问题 事务性外部队列(MSMQ 仅限 3.0) 磁盘空间不足。 移动设备上的存储问题 聚集过多的 MSMQ 资源 打开的连接太多 计算机名超过 15 个字符 死信队列中的消息过多

http://blogs.msdn.com/johnbreakwell/archive/2006/09/18/761035.aspx

我会检查您的队列版本以及出错时您的队列打开的连接数量(往返)。这些“可能”中的任何一个都会导致您的错误。

【讨论】:

这是打开的连接数。存在一个错误,它会在循环中打开连接并且永远不会关闭它们。 究竟什么是队列的“连接”?我正在使用 .NET 托管 API 进行消息队列,而 MSDN 文档从未提及“连接”的概念。 在.NET中,每个MessageQueue对象都被认为是一个连接,所以你需要Dispose他们。 该链接已损坏。使用docs.microsoft.com/en-us/archive/blogs/johnbreakwell/…【参考方案2】:

我有同样的错误信息,解决方法很简单。

有很多消息位于各种队列中,并且已达到存储限制。我去了:

服务器管理器 -> 功能

右键单击消息队列

选定的属性

在“常规”选项卡中取消勾选存储限制

我被告知使用 MSMQ 的服务将重新启动,然后错误就消失了。

【讨论】:

很好的说明。虽然我仍然会设置一个限制......让它变得“尽可能大”会带来填满硬盘驱动器的风险。这可能会导致比 msmq 的“Invalid resources to perform operation”更严重的错误。 没错,尽管监控硬盘空间非常容易,而且 IT 部门不必知道任何其他需要注意的限制。 也可以通过Computer Managment访问-> Message Queuing,右键-> Properties【参考方案3】:

我的传出队列中有太多失败的消息。 检查系统队列 -> 死信消息。我清除了这个队列,它又可以正常工作了。

【讨论】:

这也为我解决了这个问题,除了它是“事务性死信队列”【参考方案4】:

我遇到了同样的错误,在检查了上面提到的事情后发现是导致问题的计算机名称!它超过了 15 个字符,在我将其更改为较短的字符后,问题就消失了。

【讨论】:

【参考方案5】:

如果启用了日志,您将存储从队列中删除的所有消息的副本,因此您也可能会达到 MSMQ 日志限制。短期修复可能是清除队列的日志,长期 - 禁用日志。

【讨论】:

【参考方案6】:

对我来说,问题不在于托管队列的机器。将消息发送到队列的机器。我注意到源机器上的“Outgoing Queues”显示了大量消息,这导致我进入MSMQ Messages Are Stuck In The Outgoing Queue。在源机器上重新安装 MSMQ 对我来说是解决它的问题。

【讨论】:

以上是关于MSMQ:从队列接收时,啥会导致“资源不足以执行操作”错误?的主要内容,如果未能解决你的问题,请参考以下文章

C# 消息队列之MSMQ

如何在C#中使用MSMQ

转MSMQ 微软消息队列 简单 示例

MSMQ 无法删除或清除队列

MSMQ 事务性消息传递如何工作?

使用 ReceiveById 的糟糕的 MSMQ 性能