1

我正在将 WCF 与 MSMQ 端点一起使用,并且看到了这个问题中描述的行为- 基本上,虽然服务被限制为一次处理一条消息,但从队列中获取了 2 条消息,其中一条似乎保存在内存中,而另一条则正在处理。

这给监控正在发生的事情带来了问题。我有一个监控页面,它显示哪些作业在队列中,哪些正在处理中,但由于这种行为,有一段时间作业在从队列中取出但尚未开始处理时实际上消失了。我MessageQueue.GetAllMessages()用来获取当前队列中的消息列表。

我对 MSMQ 不太熟悉,但我假设当一条消息出列时,它会被标记为不可见,这样其他进程就不会将其删除。有没有办法查询这些消息,以便我可以看到它们是什么?

4

2 回答 2

1

我可以看到这会很烦人,尤其是在消息量低和消息处理程序在返回以获取下一条消息之前启动一个长时间运行的进程的情况下。

然而,从语义上讲,当消息从队列中消失时,它实际上正在被处理,只是处理有时会涉及无限期地缓存消息。

只要您使用事务队列,如果服务由于某种原因消失,隐藏的消息就不会被丢弃。

感谢这并不能直接回答您的问题。

于 2014-07-16T14:21:03.807 回答
1

如果您真的想这样做,请尝试Peek with a cursor。不过,对于监控页面来说,这听起来有点矫枉过正。

MSDN 上的 MessageQueue.Peek

您可以对其进行设置,以便获得整个消息等,但不确定性能影响。我以前也做过类似的事情...

于 2014-07-17T05:07:16.660 回答