Message Queue服务不可用

时间:2013-03-05 09:27:28

标签: c# tcp cluster-computing msmq

我有一台TCP服务器,在Windows群集中作为Windows服务运行。它接收消息并将它们放入队列(MSMQ)。我已经建立了一个公共的MSMQ队列。我收到此错误消息:

System.Messaging.MessageQueueException (0x80004005): Message Queue service is not available.
   at System.Messaging.MessageQueue.MQCacheableInfo.get_WriteHandle()
   at System.Messaging.MessageQueue.StaleSafeSendMessage(MQPROPS properties, IntPtr transaction)
   at System.Messaging.MessageQueue.SendInternal(Object obj, MessageQueueTransaction internalTransaction, MessageQueueTransactionType transactionType)

我以这种方式将消息发送到队列:

static void SendHelper(UncookedMessage uncooked)
{
    var msg = new Message(uncooked);
    msg.Formatter = new XmlMessageFormatter(new[] { typeof(UncookedMessage) });

    // (PER MESSAGE)
    msg.UseJournalQueue = false;
    msg.AttachSenderId = false;
    msg.Recoverable = true;

    SingleQueue.Send(msg);
}

队列安全性提供对服务器和群集中定义的每个用户的完全访问权限。我的队列名称是: FormatName:DIRECT = OS:application9 \ uncooked_message_single ;但我已经测试了 application9 \ uncooked_message_single application9.domain.com \ uncooked_message_single FormatName:DIRECT = OS:application9.domain.com \ uncooked_message_single 。没有人工作。

注意:此应用程序与非群集服务器上的专用队列完美配合。我对Windows集群知之甚少,但是我们的管理员说这是一个故障转移集群,它在Windows Server 2012上。

1 个答案:

答案 0 :(得分:0)

由于错误消息告诉您它无法使用请求的MSMQ服务,我建议您检查这些服务是否正确设置。

在深入了解群集配置之前,我建议您......

  • ...明确检查群集服务器上的队列的访问权限(不在单个群集节点上)

  • ...检查网络中是否有阻止您的邮件的防火墙。

在非群集环境中成功尝试过方案时,群集环境可能会有明显差异。

事实上,在群集服务器上设置MSMQ需要的配置与非群集服务器上的配置不同。

确保每个硬件节点上的MSMQ服务和Distributed Transaction Coordinator (DTC)服务已启动并正在运行。

故障转移群集管理器中,将MSMQ和DTC服务都设置为群集资源,然后将MSMQ配置为在群集DTC上依赖“dependendy”右键单击{ {1}}。

不要忘记再次检查要在群集服务器上使用的队列的访问权限。在单个节点上设置队列不起作用。

我不知道在所有情况下这是否是强制性的,但在我们的群集中,我们还将文件共享配置为MSMQ的依赖性。根据我的理解,这应该确保在节点切换后MSMQ所需的临时文件仍然可用。

此外,这里有两篇文章,我发现在设置群集节点时非常有帮助。它们可能有助于逐步确认您的配置是否正确: