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

时间:2014-04-10 10:52:05

标签: c# .net-4.5 msmq

我通过c#:

向私人队列发送消息
MessageQueue msgQ = new MessageQueue(@".\private$\aaa");
msgQ.Formatter = new XmlMessageFormatter(new[] { typeof (String) });
msgQ.Send(msg);

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

但是,是否有任何方法可以确认消息是否已成功排入队列

nb的

BeginPeekPeekCompleted是当消息在队列中可用或指定的时间间隔已过期时引发的事件帮助我,因为我需要知道msmq是否收到了我发送的消息。如果有人其他向队列输入了消息,则会引发BeginPeek。我想要的最后一件事是通过BeginPeek检查 - 这条消息来自谁。

我该怎么做?

NB2

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

3 个答案:

答案 0 :(得分:3)

我认为你要做的事情不应该在代码中处理。发送消息时,它将被放置在传出队列中。它无法到达目的地的原因有很多,例如网络分区或目标队列已满。但这应该对你的应用程序无关紧要 - 就它而言,它发送了消息,它提交了事务,它没有收到任何错误。底层基础架构的责任是完成剩下的工作,并且应该监视基础架构以确保没有技术问题。

现在,您的应用程序真正重要的是交付保证。我假设您正在描述您需要持久的事务性队列以确保消息不会丢失。有关可用选项的更多信息,请参阅here

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

答案 1 :(得分:1)

使用交易队列并让所有机器注册DTC交易可能会提供您正在寻找的内容。然而,它有点像屁股和DTC的痛苦有副作用 - 就像所有交易一起注册,包括数据库交易。

也许更好的解决方案是使用像MassTransit或NServiceBus这样的框架并执行请求 - 响应,允许reviecer响应实际的确认消息,不仅说“已经交付”而且还“我承认这一点”超时选项。

答案 2 :(得分:0)

正如Oleksii解释了可靠的交付。

然而,这会影响表现。

我可以建议:

为什么不在将MSG发送到其他系统的计算机上创建MSMQ服务器。

我在想什么

  1. 服务器1将MSMSQ发送到服务器2
  2. 服务器2接收添加到队列
  3. 服务器2处理队列/在此处激活您的代码以将MSMQ消息发送到服务器1
  4. 服务器1接收MSG(任何带有MSGId的成功消息)
  5. 执行您的进一步任务
  6. 这种方法可能需要额外的努力,但会使您的服务器远离性能滞后。