我已经阅读了许多教程和 msdn 文档,如下所示,但它们都没有解释当您从队列中读取消息时会发生什么...
- http://msdn.microsoft.com/en-us/library/ms978425.aspx
- http://msdn.microsoft.com/en-us/library/ms978430.aspx
首先需要对 msmq 有一个基本的了解,因为我以前从未实际使用过它。因此我有一些相当“新手”的问题:
- 监听队列的客户端收到消息后会发生什么情况?它会自动从队列中删除吗?
- 如果一个队列被许多客户端监听怎么办? msmq 能否保证消息将到达任何(且仅)“一个”监听客户端?
- 公共(public)/私有(private)队列之间的真正区别是什么?我什么时候应该去公共(public)队列?
我还需要知道如何跟踪消息何时进入队列以及何时被消耗?
最佳答案
当从队列中取出消息时,该消息被视为已接收并从队列中删除。 Msmq 是强有序的 - 您将无法收到前一条消息之前的消息。您可以使用 transactional queue如果您希望根据消息的接收对您的应用程序意味着什么来控制从队列中删除消息。 除非它被删除,否则您将继续一遍又一遍地收到相同的消息。这被称为 queue poisoning ,本身就是一个值得讨论的话题。
消息在收到后就会被删除,因此一次只有一个客户端可以收到一条消息。如果您需要其他语义,可以将 receive 与
Peek
结合起来。私有(private)队列和公共(public)队列在编程访问方面没有太大区别。主要区别在于它如何向目录服务公开。私有(private)队列仍然可以通过队列路径公开。关于 types of destination queues on MSDN 有一个很好的解释.
WCF 有一个 MSMQ 绑定(bind),可以对队列进行抽象,因此如果您更倾向于使用合约,那么这是一种替代方案(尽管我个人不推荐它)。
关于.net - msmq 基础知识以及如何跟踪消息的传入和传出时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12227569/