使用MSMQ(C#)确保/验证消息传递
如何“验证”使用MSMQ发送到专用本地队列的消息是否已实际传递?我特别想到一种情况,侦听器(在我的例子中是C服务)没有运行,因此传递无法成功。它总是发送到队列 如果你的服务没有运行来接收它,它只是坐在那里,耐心地等待,直到有人收到它使用MSMQ(C#)确保/验证消息传递,c#,.net,msmq,C#,.net,Msmq,如何“验证”使用MSMQ发送到专用本地队列的消息是否已实际传递?我特别想到一种情况,侦听器(在我的例子中是C服务)没有运行,因此传递无法成功。它总是发送到队列 如果你的服务没有运行来接收它,它只是坐在那里,耐心地等待,直到有人收到它 您知道它已被发送到队列,因为.Send()返回时不会崩溃。它始终被发送到队列 如果你的服务没有运行来接收它,它只是坐在那里,耐心地等待,直到有人收到它 您知道它已被发送到队列,因为.Send()返回时不会崩溃。您只能保证它可以在不采取额外步骤的情况下到达队列。要处理
您知道它已被发送到队列,因为.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#服务)没有运行,因此传递无法成功。”公平地说,我只是不想让任何人认为您需要特别验证消息是否进入实际队列。请澄清,你说的是检查接收者是否正在运行,而不是它实际上只是进入了队列。有区别,是的。这正是我所说的情景。是的,但那是