【问题标题】:MSMQ service does not recover when restarted with Recoverable message on queue使用 Recoverable message on queue 重新启动时,MSMQ 服务无法恢复
【发布时间】:2014-01-20 12:34:15
【问题描述】:

我有一个在 Win2008 R2 上运行的私有、非事务性消息队列。当我执行以下操作时队列中断:

  1. 将可恢复的消息放在队列中,如下所示:

    Message msg = new Message
    {
      Body = "hello",
      Formatter = new XmlMessageFormatter(),
      Label = "Notification",
      Recoverable = true,
      AppSpecific = 123
    };
    
    mq.Send(msg);
    

    不要检索消息!

  2. 重新启动消息队列服务
  3. 服务没有成功重启。事件查看器中记录了以下消息:

    The Message Queuing service cannot start because a queue is in an
    inconsistent state. For more information, see Microsoft Knowledge
    Base article 827493 at support.microsoft.com.
    

注意事项:

  • 以这种方式添加到队列的消息可以在重新启动之前从队列中成功检索。
  • 让队列再次运行的唯一方法是遵循以下说明:MSMQ Inconsistent State After Restart,但这显然会阻止消息恢复。
  • 如果我留下 Message.Recoverable = false 则服务将成功重新启动。但我希望我的消息在服务重启后仍然有效。
  • 当我将队列设置为事务时,我得到完全相同的行为。

有什么想法吗?

【问题讨论】:

  • 我也有同样的问题 :( 我的消息是使用 WCF 创建的,但也可以恢复。

标签: .net msmq windows-server-2008-r2


【解决方案1】:

提供您的机器名称少于 15 个字符,它就会起作用。这是由于 Netbios 名称只能是 15 个字符或更少。这导致 MSMQ 服务出现问题,因为它最终处于错误中指定的不一致状态。为了解决这个问题,卸载了 MSMQ,将机器重命名为小于 15 个字符,然后重新安装了 MSMQ。这解决了问题。

【讨论】:

  • 这解决了我的情况。遗憾的是,解决困难和无证问题的真正解决方案因为不受欢迎而错过了投票。就我而言,我只需要缩短服务器名称并重新启动,MSMQ 就恢复了。
【解决方案2】:

听起来好像有东西干扰了存储文件。 可恢复(包括事务)消息被写入 MSMQ\Storage 目录中的文件并映射到内存中。 启动时,重新加载文件以重新创建映射到内存的消息。 由于某种原因,这些存储文件不再起作用。

我会寻找的东西:

  • 可以访问 system32\msmq 目录树的任何其他软件,例如防病毒产品。从目录树中阻止这些产品。
  • 存储在本地连接的磁盘或网络驱动器(例如 SAN)上;如果不是本地磁盘,请尝试重新配置 MSMQ 以使用本地磁盘。
  • 磁盘没有错误吗?运行 chkdsk 或类似的。
  • 如果您创建一个新的 provate 队列,问题是否也会影响它?

干杯
约翰·布雷克韦尔

【讨论】:

  • 感谢您的快速回复,我已经检查了您建议的所有内容,但仍然没有运气:没有运行此类软件(使用 Procmon 观看)/它在本地磁盘上/Chkdsk 报告没有错误/新的私有队列的行为相同。还有其他想法吗?
  • 不。我建议向 Microsoft 支持提出案例。
【解决方案3】:

尝试将 msmq 目录移动到其他位置。可能是磁盘权限问题。

【讨论】:

  • 刚刚尝试过,没有运气;好像不是权限问题。
猜你喜欢
  • 2010-12-18
  • 1970-01-01
  • 2018-05-21
  • 2016-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-04
相关资源
最近更新 更多