【发布时间】:2012-03-14 15:05:18
【问题描述】:
我有一个现有的系统,想知道如果 MSMQueue 重新启动,它是否可以保留队列的值。当我重新启动时它会清除该值。
【问题讨论】:
标签: msmq
我有一个现有的系统,想知道如果 MSMQueue 重新启动,它是否可以保留队列的值。当我重新启动时它会清除该值。
【问题讨论】:
标签: msmq
是的,MSMQ 是一种持久队列解决方案。它将消息安全地存储在不受断电影响的后备存储上(当然,除非您遇到诸如磁盘爆炸之类的事情,当然还有真正巨大的电涌)。
它的重点是在潜在不可靠的环境中提供可靠的消息队列。为此,在特定服务器出现故障时丢失消息将是一个相当大的劣势。
来自Microsoft's own pages(并为类似推销的语言道歉):
消息队列应用程序可以使用消息队列基础结构跨异构网络和可能离线的计算机进行通信。消息队列提供有保证的消息传递、高效的路由、安全性、事务支持和基于优先级的消息传递。
【讨论】:
正如 paxdiablo 所写,MSMQ 是一种持久的队列解决方案,但不是默认的!默认是将消息存储在 RAM 中,并让 MSMQ 将消息持久保存到磁盘,这样在服务器崩溃时它们不会丢失,您必须在每条消息上指定它。
如果您查看属性Message.Recoverable,可以找到更多信息。
【讨论】:
正如@Kjell-Åke Gafvelin 已经说过的,您可以配置每条消息,但恕我直言,更方便的方法是将其设置在队列中本身。 p>
MessageQueue msgQ = new MessageQueue(@".\private$\Orders");
msgQ.DefaultPropertiesToSend.Recoverable = true;
msgQ.Send("This message will be marked as Recoverable");
msgQ.Close();
来自上面的文章(我的亮点):
默认,MSMQ 将一些消息存储在内存中以增加 性能,并且可以从队列中发送和接收消息 从未写入磁盘。
此外,您应该使队列事务性以保证正确发送和接收消息。
(2020 年 10 月 27 日编辑:删除了指向外部 Microsoft 帖子“使用 MSMQ 和 .NET 进行可靠消息传递”的链接,因为它不再可用。)
【讨论】: