【问题标题】:MSMQ - can I query messages which are currently being processed?MSMQ - 我可以查询当前正在处理的消息吗?
【发布时间】:2014-07-11 16:05:40
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# wcf msmq netmsmqbinding msmq-wcf


    【解决方案1】:

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

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

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

    感谢这并没有直接回答您的问题。

    【讨论】:

    • 谢谢,我已经测试了持久性并确认在服务失败的情况下隐藏的消息会返回到队列中。没有办法准确了解正在发生的事情,这很烦人。
    • 是的,这很烦人。欢迎来到 MSMQ。
    【解决方案2】:

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

    MessageQueue.Peek on MSDN

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

    【讨论】:

    • peek 是否允许您查看正在处理的消息?我想我已经尝试过了,但也许我做错了什么。或者您是否建议调用 peek 并等待消息进入队列?
    • 是的,就是这样。光标保持活动状态并查看传入消息。使用类似于 msdn 示例的 POC 来查看它是否适合。超时可能很有趣,但你可以让它变大,它会在超时时抛出。
    • 嗯,我想这可能会奏效,尽管它可能很棘手,因为它是一个 IIS 托管服务。我认为您是对的,尽管这对我的监控页面来说可能是矫枉过正。如果我没有找到其他方法,我会记住它。
    • 在 IIS 中的托管是一个单独的东西...如果您想快速查看外观,请查看 MSMQ Inspector (viridissoftware.com.au/Products/MSMQInspector) - 查看队列消息并打开“恒定窥视模式”,它完全符合我们的讨论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-12
    相关资源
    最近更新 更多