【问题标题】:Ensure / Verify message delivery using MSMQ (C#)使用 MSMQ (C#) 确保/验证消息传递
【发布时间】:2009-09-09 13:45:43
【问题描述】:

您如何“验证”使用 MSMQ 发送到私有本地队列的消息是否已实际传递?我特别想到了侦听器(在我的例子中是 C# 服务)没有运行,因此无法成功交付的场景。

【问题讨论】:

    标签: c# .net msmq


    【解决方案1】:

    您只能保证它可以进入队列而无需采取额外的步骤。要处理“未运行接收器”场景,您需要对接收器进行编码,以便在它处理消息时将消息发送回服务器。原始发件人将负责跟踪发送的消息并验证客户端是否已收到它们。

    这是您在决定是否使用 MSMQ 而不是远程处理或 Web 服务方案时应该做出的决定之一。例如,我们有一个项目用于在发生紧急情况(例如产品召回/食品安全问题)时通知我们所有的零售地点。我们需要立即知道商店的监听器是否正在运行,因此我们选择了远程处理,以及何时发件人收到一个错误,表明其中一位听众没有在听,我们需要拿起电话并打电话。

    只是需要记住的一点。

    编辑 - 澄清

    上面我真的给出了两个选项。

    1. 对客户端进行编码,以便在收到消息时将消息发送回发送者。
    2. 使用其他选项,例如远程处理,您可以在其中检测客户端是否正在运行并接收消息。

    【讨论】:

    • 请注意,您说的是检查接收器是否正在运行,而不是它实际上只是进入队列。有区别。
    • 是的。这正是我所说的场景。
    • 是的,但这不是所要求的(恕我直言)。那是关于你的应用程序的完整性,而不是 MSMQ。
    • 我不想争论,但再看问题。他特别问“我特别想到了这样一种情况,即监听器(在我的例子中是 C# 服务)没有运行,因此无法成功交付。”
    • 很公平,我只是不想让任何人认为您需要专门验证消息是否进入实际队列。
    【解决方案2】:

    它总是被发送到队列中。

    如果您的服务没有运行以接收它,它只是坐在那里,耐心等待,直到有人接收它。

    您知道它已被发送到队列,因为 .Send() 返回时不会崩溃。

    【讨论】:

    • 我可以在队列中查询等待消息的数量,而不实际取出消息吗?
    • 我不确定,我从未尝试过。有MessageQueue.GetAllMessages(),但他们可能会将它们从队列中弹出。不过我怀疑你可以,因为 Windows Servers MMC 管理单元可以告诉你。
    • Peek() 会这样做吗?值得一试。
    • 我不这么认为,那只是显示下一条消息,它不会让你计算它们。
    【解决方案3】:

    您可以使用administrative queues 提取此信息

    【讨论】:

      【解决方案4】:

      当您发送消息时,您可以指定 AcknowledgeType,这将允许您确定(通过肯定或否定确认)消息是否到达队列和/或是否从队列中接收。确认通过 MSMQ 作为消息发送到管理队列,因此请确保在消息对象上分配该属性。

      您可以通过相关 ID(原始消息的 ID)检查管理队列的确认。

      【讨论】:

        猜你喜欢
        • 2010-09-17
        • 2018-09-05
        • 1970-01-01
        • 1970-01-01
        • 2015-10-02
        • 2010-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多