在队列中使用Recoverable消息重新启动时,MSMQ服务无法恢复

时间:2011-07-14 05:00:26

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

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

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

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

    请勿检索邮件!

  2. 重新启动Message Queue服务
  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.
    
  4. 注意事项:

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

    有什么想法吗?

3 个答案:

答案 0 :(得分:1)

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

我会寻找的东西:

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

干杯
John Breakwell

答案 1 :(得分:1)

尝试将msmq目录移动到其他位置。也许磁盘上存在权限问题。

答案 2 :(得分:0)

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