非事务性队列上的MSMQ错误

时间:2012-11-26 13:59:10

标签: c# msmq

使用简单的代码从队列中查看消息

message = myQueue.Peek(TimeOutForPeek);

另一方面,消息只是发送到队列:

sendQueue.Send(message);

如果myQueue是事务性的,那么一切正常。但如果没有,经过一段时间的运行后,我得到了异常(见下文),处理停止了。

  

System.Messaging.MessageQueueException(0x80004005):操作是   在完成之前取消。在   System.Messaging.MessageQueue.ReceiveCurrent(TimeSpan超时,Int32   action,CursorHandle游标,MessagePropertyFilter过滤器,   MessageQueueTransaction internalTransaction,   MessageQueueTransactionType transactionType)at   System.Messaging.MessageQueue.Peek(TimeSpan timeout)

可能导致这种差异的原因以及如何处理此类失败? 我对MSMQ不太熟悉,任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:2)

我不能完全指责它,但至少错误信息明显表明有一个长时间运行的过程在一定时间内没有完成。

正如您在上面的评论中所述,在短时间内收到了3000-5000条消息,我认为接收系统在发生错误时仍然忙于处理它们并且不会很快返回以读取下一条消息(s )在超时发生之前。

您可能正在达到系统的资源限制吗?

您的描述适合......就像,机器正在收到如此多的消息但在下一条消息到达之前无法快速处理它们。

如果它适用于事务性队列,我怀疑MSMQ resouces处理在两种情况下都不同。

查看John Breakwell非常详细的博文Insufficient Resources? Run away, run away!并查看是否有什么可以找到帮助。那里有很多东西。

其他想法:

如果您的接收端是单线程的,请考虑并行处理消息(如果您尚未这样做)(如果适用于您的方案)。这可能有助于在新邮件到达之前更快地将消息从队列中删除。