1

这是场景:

2 台机器:“机器 A”和“机器 B”。

假设它们对应的 IP 地址是 192.168.0.100(对于 A)和 192.168.0.200(对于 B)。两台机器上都安装了 MSMQ,在 Windows Server 2008 上。

机器A

已配置以下队列:private$\aaa事务性

该队列有一个消费者,它包装ReadMSMQ 事务中的每个操作,并且仅从“当前”消息中读取(即,不使用游标操作)。

机器 B

有一个将消息发送到的应用程序FormatName:direct=os:192.168.0.100\private$\aaa。每条Send消息都包装在一个 MSMQ 事务中,带有(C# 中的代码):
TimeToReachQueue = Message.InfiniteTimeout

TimeToBeReceived = Message.InfiniteTimeout

还有……问题

在这种场景和配置下private$\aaa,是从 B 发送到 A 的消息:

  1. 交付一次?我的意思是,我是否必须在机器 A 上的消费者应用程序中确保“当前”消息实际上是“新的”(也就是说,之前没有处理过)?还是 MSMQ 本身会处理这个问题?我知道这听起来有点傻,因为这是一个队列,对吧?!但是我找不到一个具体的参考资料声称这些消息是有序的。我见过这样的说法,但不是来自微软官方资源。
  2. 为了?我的意思是,是否有可能M1由于网络问题,无法从 B 向 A 发送消息,然后,也许网络恢复正常,并且以下消息,M2成功发送到机器 A?

非常感谢!

4

1 回答 1

3
  1. 保证交付一次,但请记住,您有一个事务队列,因此如果消息处理第一次失败,那么它将再次交付,直到它成功或移动到中毒消息队列。因此,“交付一次”仅在该上下文中得到保证,如果您操作的其他资源也是事务性的并参与分布式事务,那么您应该是安全的。

  2. 消息“按照发送顺序一起发送,或者根本不发送”。请参阅MSMQ 提示

于 2011-03-23T15:47:07.357 回答