以下是该方案:
2台机器:“机器A”和“机器B”。
让我们坐下来,他们相应的IP地址是192.168.0.100(对于A)和192.168.0.200(对于B)。这两台机器都安装了MSMQ,在Windows Server 2008上。
是否配置了以下队列:private$\aaa
,交易。
对该队列有一个使用者,它在MSMQ事务中包装每个Read
操作,并且只从“当前”消息中读取(即,不使用任何游标操作)。
有一个应用程序向FormatName:direct=os:192.168.0.100\private$\aaa
发送消息。每个Send
消息都包含在MSMQ事务中,(C#中的代码):
TimeToReachQueue = Message.InfiniteTimeout
和
TimeToBeReceived = Message.InfiniteTimeout
在private$\aaa
的这种情况和配置下,是从B发送到A的消息:
M1
从B发送到A,然后,网络可能会回来正常,以下消息M2
已成功发送到机器A?非常感谢!
答案 0 :(得分:3)
Delivered Once保证,但请记住,您有一个事务性队列,因此如果第一次消息处理失败,那么它将再次传递,直到它成功或被移动到中毒的消息队列。因此,仅在该上下文中保证“已交付一次”,并且如果您操纵的其他资源也是事务性的并且参与分布式事务,那么您应该是安全的。
消息“按照发送顺序一起发送,或者根本不发送”。请参阅MSMQ Tips