我通过c#:
向私人队列发送消息MessageQueue msgQ = new MessageQueue(@".\private$\aaa");
msgQ.Formatter = new XmlMessageFormatter(new[] { typeof (String) });
msgQ.Send(msg);
它确实有效,我确实在队列中看到了消息。
但是,是否有任何方法可以确认消息是否已成功排入队列?
nb的
BeginPeek
和PeekCompleted
是当消息在队列中可用或指定的时间间隔已过期时引发的事件。 不帮助我,因为我需要知道msmq是否收到了我发送的消息。如果有人其他向队列输入了消息,则会引发BeginPeek
。我想要的最后一件事是通过BeginPeek
检查 - 这条消息来自谁。
我该怎么做?
NB2
或许我不必担心,因为如果没有插入消息,msgQ.Send(msg);
会引发异常......?
答案 0 :(得分:3)
我认为你要做的事情不应该在代码中处理。发送消息时,它将被放置在传出队列中。它无法到达目的地的原因有很多,例如网络分区或目标队列已满。但这应该对你的应用程序无关紧要 - 就它而言,它发送了消息,它提交了事务,它没有收到任何错误。底层基础架构的责任是完成剩下的工作,并且应该监视基础架构以确保没有技术问题。
现在,您的应用程序真正重要的是交付保证。我假设您正在描述您需要持久的事务性队列以确保消息不会丢失。有关可用选项的更多信息,请参阅here
此外,如果您需要一些标识符作为确认显示给用户,通常的做法是在发送代码中生成它并将其放入消息本身。然后处理代码将使用id来完成所需的工作。
答案 1 :(得分:1)
使用交易队列并让所有机器注册DTC交易可能会提供您正在寻找的内容。然而,它有点像屁股和DTC的痛苦有副作用 - 就像所有交易一起注册,包括数据库交易。
也许更好的解决方案是使用像MassTransit或NServiceBus这样的框架并执行请求 - 响应,允许reviecer响应实际的确认消息,不仅说“已经交付”而且还“我承认这一点”超时选项。
答案 2 :(得分:0)
正如Oleksii解释了可靠的交付。
然而,这会影响表现。
我可以建议:
为什么不在将MSG发送到其他系统的计算机上创建MSMQ服务器。
我在想什么
这种方法可能需要额外的努力,但会使您的服务器远离性能滞后。