Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用MSMQ(C#)确保/验证消息传递_C#_.net_Msmq - Fatal编程技术网

使用MSMQ(C#)确保/验证消息传递

使用MSMQ(C#)确保/验证消息传递,c#,.net,msmq,C#,.net,Msmq,如何“验证”使用MSMQ发送到专用本地队列的消息是否已实际传递?我特别想到一种情况,侦听器(在我的例子中是C服务)没有运行,因此传递无法成功。它总是发送到队列 如果你的服务没有运行来接收它,它只是坐在那里,耐心地等待,直到有人收到它 您知道它已被发送到队列,因为.Send()返回时不会崩溃。它始终被发送到队列 如果你的服务没有运行来接收它,它只是坐在那里,耐心地等待,直到有人收到它 您知道它已被发送到队列,因为.Send()返回时不会崩溃。您只能保证它可以在不采取额外步骤的情况下到达队列。要处理

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

它总是发送到队列

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


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

它始终被发送到队列

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


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

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

这是您在决定是否使用MSMQ而不是远程处理或web服务场景时应该做出的决定之一。例如,我们有一个项目,用于在发生紧急情况(如产品召回/食品安全问题)时通知我们所有的零售店。我们需要立即知道商店的侦听器是否正在运行,因此我们选择了远程处理,当发送者收到一个错误指示其中一个侦听器未侦听时,我们需要拿起电话打电话

只是要记住一些事情

编辑-澄清

我在上面给出了两个选择

  • 对客户端进行编码,使其在收到消息时将消息发送回发件人
  • 使用另一个选项,例如远程处理,您可以在其中检测客户端是否正在运行并接收消息

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

    这是您在决定是否使用MSMQ而不是远程处理或web服务场景时应该做出的决定之一。例如,我们有一个项目,用于在发生紧急情况(如产品召回/食品安全问题)时通知我们所有的零售店。我们需要立即知道商店的侦听器是否正在运行,因此我们选择了远程处理,当发送者收到一个错误指示其中一个侦听器未侦听时,我们需要拿起电话打电话

    只是要记住一些事情

    编辑-澄清

    我在上面给出了两个选择

  • 对客户端进行编码,使其在收到消息时将消息发送回发件人
  • 使用另一个选项,例如远程处理,您可以在其中检测客户端是否正在运行并接收消息

  • 您可能可以使用

    提取此信息您可能可以使用

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


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

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


    您可以通过关联ID(原始邮件的ID)检查管理队列中的确认信息。

    我可以查询队列中等待的邮件数,而不实际从队列中取出邮件吗?我不确定,我从未尝试过。存在
    MessageQueue.GetAllMessages()
    ,但它们可能会将消息从队列中弹出。我想你可以,因为Windows服务器MMC管理单元可以告诉你。Peek()会这样做吗?值得一试。我不这么认为,这只是显示下一条消息,不允许您计算它们。我可以查询队列中等待的消息数,而不实际从队列中取出消息吗?我不确定,我从未尝试过。存在
    MessageQueue.GetAllMessages()
    ,但它们可能会将消息从队列中弹出。我想你可以,因为Windows服务器MMC管理单元可以告诉你。Peek()会这样做吗?值得一试。我不这么认为,这只是显示下一条消息,它不允许你计算它们。请明确,你说的是检查接收器是否正在运行,而不是它实际上刚刚进入队列。有区别,是的。这正是我所说的情景。是的,但这不是我所问的(IMHO)。这是关于你的应用程序的完整性,而不是MSMQ。我不想争论,但再看看这个问题。他特别问:“我特别想到一种情况,即侦听器(在我的情况下是C#服务)没有运行,因此传递无法成功。”公平地说,我只是不想让任何人认为您需要特别验证消息是否进入实际队列。请澄清,你说的是检查接收者是否正在运行,而不是它实际上只是进入了队列。有区别,是的。这正是我所说的情景。是的,但那是