2

拥有从队列中窥视消息的简单代码

message = myQueue.Peek(TimeOutForPeek);

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

sendQueue.Send(message);

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

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

什么可能导致这种差异以及如何处理这种故障?我对 MSMQ 不是很熟悉,任何帮助将不胜感激。

4

1 回答 1

2

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

正如您在上面的评论中所说,在短时间内收到了 3000-5000 条消息,我想当错误发生时接收系统仍在忙于处理它们,并且没有尽快返回以在 a 之前阅读下一条消息发生超时。

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

您的描述将适合...例如,机器正在接收如此多的消息,但在下一条消息到达之前无法足够快地处理它们。

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

看看 John Breakwell 非常详细的博文Insufficient Resources?逃跑,逃跑!并检查是否有一些你能找到有用的东西。里面有很多东西。

其他想法:

如果您的接收端是单线程的,如果您还没有这样做(如果适用于您的场景),请考虑并行处理消息。这可能有助于在新消息到达之前更快地将消息从队列中取出。

于 2012-11-28T12:46:46.867 回答