1

我有一个 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 上。

4

1 回答 1

0

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

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

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

  • ...检查是否有防火墙阻止网络中的消息。

当您在非集群环境中成功尝试了您的方案时,集群环境中可能显然存在差异。

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

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

故障转移群集管理器中,将 MSMQ 和 DTC 服务都设置为群集资源,然后将 MSMQ 配置为依赖群集 DTC 作为“ dependendy”右键单击MSMQ -> Properties -> Dependencies

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

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

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

于 2013-03-08T08:33:00.420 回答