我有一台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上。
答案 0 :(得分:0)
由于错误消息告诉您它无法使用请求的MSMQ服务,我建议您检查这些服务是否正确设置。
在深入了解群集配置之前,我建议您......
...明确检查群集服务器上的队列的访问权限(不在单个群集节点上)
...检查网络中是否有阻止您的邮件的防火墙。
在非群集环境中成功尝试过方案时,群集环境可能会有明显差异。
事实上,在群集服务器上设置MSMQ需要的配置与非群集服务器上的配置不同。
确保每个硬件节点上的MSMQ
服务和Distributed Transaction Coordinator (DTC)
服务已启动并正在运行。
在故障转移群集管理器中,将MSMQ和DTC服务都设置为群集资源,然后将MSMQ配置为在群集DTC上依赖“dependendy
”右键单击{ {1}}。
不要忘记再次检查要在群集服务器上使用的队列的访问权限。在单个节点上设置队列不起作用。
我不知道在所有情况下这是否是强制性的,但在我们的群集中,我们还将文件共享配置为MSMQ的依赖性。根据我的理解,这应该确保在节点切换后MSMQ所需的临时文件仍然可用。
此外,这里有两篇文章,我发现在设置群集节点时非常有帮助。它们可能有助于逐步确认您的配置是否正确: