什么是正确的配置,以便在MSMQ中按顺序发送一次消息?

时间:2011-03-23 15:40:09

标签: .net transactions msmq ordered-delivery

以下是该方案:

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

让我们坐下来,他们相应的IP地址是192.168.0.100(对于A)和192.168.0.200(对于B)。这两台机器都安装了MSMQ,在Windows Server 2008上。

机器A

是否配置了以下队列:private$\aaa交易

对该队列有一个使用者,它在MSMQ事务中包装每个Read操作,并且只从“当前”消息中读取(即,不使用任何游标操作)。

机器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?
  3. 非常感谢!

1 个答案:

答案 0 :(得分:3)

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

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