MSMQ是否通过C#-确认收到该消息?

MSMQ是否通过C#-确认收到该消息?,c#,.net-4.5,msmq,C#,.net 4.5,Msmq,我正在通过c#向专用队列发送消息: 它确实有效,我确实在队列中看到了消息 但是,无论消息是否成功到达队列,是否有任何方法可以获得ACK ps BeginPeek和PeekCompleted是当队列中的消息可用或指定的时间间隔过期时引发的事件。它对我没有帮助,因为我需要知道我发送的消息是否被msmq接收BeginPeek。我最不想做的就是通过BeginPeek-查看这条消息来自谁 我该怎么做 ps2 或者我不必担心,因为msgQ.Send(msg)将引发异常…?使用事务队列并让所有计算机注册DTC

我正在通过c#向专用队列发送消息:

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

但是,无论消息是否成功到达队列,是否有任何方法可以获得ACK

ps

BeginPeek
PeekCompleted
是当队列中的消息可用或指定的时间间隔过期时引发的事件。它对我没有帮助,因为我需要知道我发送的消息是否被msmq接收<如果有人其他人向队列输入消息,则还会引发code>BeginPeek。我最不想做的就是通过
BeginPeek
-查看这条消息来自谁

我该怎么做

ps2


或者我不必担心,因为
msgQ.Send(msg)将引发异常…?

使用事务队列并让所有计算机注册DTC事务可能会提供您所需的功能。然而,这有点让人头疼,DTC也有副作用——就像所有事务都注册在一起一样,包括DB事务


也许更好的解决方案是使用MassTransit或NServiceBus这样的框架并执行请求响应,允许审阅者使用实际的确认消息进行响应,不仅说“这已交付”,还说“我确认这一点”,并提供超时选项

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

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


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

正如Oleksii所解释的可靠交付

但是,这可能会影响性能

我的建议是:

为什么不在向其他系统发送消息的计算机上创建MSMQ服务器呢

我想的是

  • 服务器1向服务器2发送MSMSQ
  • 服务器2接收添加到队列的数据
  • 伺服器2处理伫列/在此激发您的程式码,以将MSMQ讯息传送至伺服器1
  • 服务器1接收消息(任何成功的消息与MSGId)
  • 做进一步的工作

  • 这种方法可能会增加一英里,但会使您的服务器避免性能滞后。

    不,我不想这样。我正在寻找一个代码来检查消息是否正确插入队列。这就是全部。没有数据库。事务队列在事务关闭时确认进入队列。但是如果队列是事务性的,当您读取它时,它也在事务范围内。这就是DTC涉及的地方。我的iis和msmq计算机是同一台计算机。如果是,消息是否在进入传入队列之前存储在传出队列中?此外,在事务中要完成的操作不超过1个。。。那么为什么不建议使用事务性队列呢?正如我在回答中的链接所指出的,如果队列处理服务在处理非事务性队列时崩溃,那么当前消息将丢失。如果可以,请使用非事务性。至于另一个问题,如果所有通信都是本地的,则不应使用传出队列。
    MessageQueue msgQ = new MessageQueue(@".\private$\aaa");
    msgQ.Formatter = new XmlMessageFormatter(new[] { typeof (String) });
    msgQ.Send(msg);