【问题标题】:Can MSMQueue retain their value when the Windows restart?Windows 重新启动时,MSMQueue 可以保留其值吗?
【发布时间】:2012-03-14 15:05:18
【问题描述】:

我有一个现有的系统,想知道如果 MSMQueue 重新启动,它是否可以保留队列的值。当我重新启动时它会清除该值。

【问题讨论】:

    标签: msmq


    【解决方案1】:

    是的,MSMQ 是一种持久队列解决方案。它将消息安全地存储在不受断电影响的后备存储上(当然,除非您遇到诸如磁盘爆炸之类的事情,当然还有真正巨大的电涌)。

    它的重点是在潜在不可靠的环境中提供可靠的消息队列。为此,在特定服务器出现故障时丢失消息将是一个相当大的劣势。

    来自Microsoft's own pages(并为类似推销的语言道歉):

    消息队列应用程序可以使用消息队列基础结构跨异构网络和可能离线的计算机进行通信。消息队列提供有保证的消息传递、高效的路由、安全性、事务支持和基于优先级的消息传递。

    【讨论】:

    • 我认为'保证消息传递'是指队列的事务功能。当然,以故障安全的方式持久保存它们将是其中的必要部分。 :-)。但这不是默认情况下的。
    【解决方案2】:

    正如 paxdiablo 所写,MSMQ 是一种持久的队列解决方案,但不是默认的!默认是将消息存储在 RAM 中,并让 MSMQ 将消息持久保存到磁盘,这样在服务器崩溃时它们不会丢失,您必须在每条消息上指定它。

    如果您查看属性Message.Recoverable,可以找到更多信息。

    【讨论】:

      【解决方案3】:

      正如@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 进行可靠消息传递”的链接,因为它不再可用。

      【讨论】:

      • 请注意,该文章并非 100% 准确。 “为什么我的 Express MSMQ 消息被写入磁盘?” blogs.msdn.com/b/johnbreakwell/archive/2008/04/04/…
      • 感谢@John 提供更多信息。基本面动摇了。 :-)
      • 谢谢你,@乔尔。我删除了链接。微软似乎清理了旧页面。约翰的喜欢也坏了。很高兴我在这里引用了重要部分以供参考。
      猜你喜欢
      • 1970-01-01
      • 2014-03-08
      • 1970-01-01
      • 2013-02-17
      • 2012-10-28
      • 1970-01-01
      • 2014-05-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多