2011-07-14 22 views
1

我有一个在Win2008 R2上运行的私有非事务性消息队列。使用队列上的可恢复消息重新启动MSMQ服务时不会恢复

  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. 
    

注意要点:

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

任何想法?

+0

我有完全相同的问题:(我的消息是使用WCF创建的,但也是可恢复的 – tommed

回答

1

声音像是干扰存储文件。 可恢复(包括事务)消息被写入MSMQ \ Storage目录中的文件以及被映射到内存中。 启动时,将重新加载文件以重新创建映射到内存中的消息。 由于某些原因,这些存储文件不再有效。

事情我会找:

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

干杯
约翰Breakwell

+0

感谢您的快速回复,我已经检查了您所建议的所有内容,但仍然没有运气:没有运行此类软件(使用Procmon )/它在本地磁盘上/ Chkdsk报告没有错误/一个新的专用队列的行为是一样的任何其他想法? – masty

+0

不可以,我建议提出一个与微软支持的案例 –

1

尝试MSMQ dirctory移动到不同的位置。也许在磁盘上存在权限问题。

+0

刚刚尝试过,没有运气;没有似乎是一个许可问题。 – masty

0

给你的机器名称少于15个字符然后它会起作用。这是由于Netbios名称只能包含15个字符或更少。这导致MSMQ服务出现问题,导致它在错误中指定的不一致状态下结束。要解决此问题,请卸载MSMQ,将机器重命名为小于15个字符,然后重新安装MSMQ。这解决了这个问题。

相关问题