MSMQ通过C# - 确认收到的消息?

Roy*_*mir 5 c# msmq .net-4.5

我正通过c#向私人队列发送消息:

MessageQueue msgQ = new MessageQueue(@".\private$\aaa");
msgQ.Formatter = new XmlMessageFormatter(new[] { typeof (String) });
msgQ.Send(msg);
Run Code Online (Sandbox Code Playgroud)

它确实有效,我确实在队列中看到了这条消息.

但是,有没有办法获得ACK消息是否成功进入队列

NB

BeginPeek并且PeekCompleted是当队列中消息可用或指定的时间间隔到期时引发的事件.它没有帮助我,因为我需要知道我发送的消息是否由msmq获取.BeginPeek如果其他向队列输入消息,也会引发此异常.我想要的最后一件事就是检查通过BeginPeek- 这条消息来自谁.

我该怎么做 ?

NB2

或者也许我不必担心,因为msgQ.Send(msg);如果没有插入消息会引发异常......?

Vyt*_*nis 3

我认为你想做的事情不应该在代码中处理。当您发送消息时,它会被放入发送队列中。无法到达目的地的原因有很多,例如网络分区或目的地队列已满。但这对您的应用程序来说并不重要 - 就其而言,它发送了消息,它提交了事务,它没有收到错误。底层基础设施有责任完成剩下的工作,并且应该对基础设施进行监控以确保不存在技术问题。

现在对您的应用程序来说真正重要的是交付保证。我从您所描述的场景中假设您需要持久的事务队列来确保消息不会丢失。有关可用选项的更多信息,请阅读此处

此外,如果您需要向用户显示一些标识符作为确认,常见的做法是在发送代码中生成它并将其放置在消息本身中。然后处理代码将使用该 id 来完成所需的工作。