我有一个2节点集群,在Windows Server 2012R2上安装了PowerShell 4.0版。群集中的一个角色是“消息队列”,名为“TESTMSMQ'”,其中安装了大约20个专用队列。
在全新的PowerShell控制台中,我使用命令
将环境变量_CLUSTER_NETWORK_NAME_设置为' TESTMSMQ'$env:_CLUSTER_NETWORK_NAME_='TESTMSMQ'
当我运行Get-MsmqQueue -Name *时,我什么都没收到。但是,如果我运行compmgmt.msc,我可以看到列出的所有队列,如果我将System.Messaging程序集加载到PowerShell会话中,我可以看到队列。
[System.Reflection.Assembly]::LoadWithPartialName("System.Messaging")
[System.Messaging.MessageQueue]::Exists('.\private$\MyTestQueue')
返回True
有没有人知道为什么MSMQ cmdlet无法找到队列,但.net程序集可以和计算机管理管理单元一起查看队列?
为了清楚起见,本地节点或物理节点上没有定义队列。 "私人$ \ MyTestQueue"仅在MSMQ安装角色" TESTMSMQ"。
上定义因此,如果Exists()使用localhost名称返回True,那么我会假设环境是MSMQ角色,而不是物理节点。
答案 0 :(得分:1)
有点晚了,但是我在任何地方都找不到这个问题的答案。也许其他人也在寻找...
最后,从几个地方整理了一些想法,并在Windows Server 2016上实现了这一点。
在群集节点之一上:
$env:computername = "MsmqHostName"
Get-MsmqQueue | Format-Table -Property QueueName,MessageCount
从集群中远程:
Invoke-Command -ScriptBlock {$env:computername = "msmqHostName";Get-MsmqQueue | Format-Table -Property QueueName,MessageCount } -ComputerName ClusternNodeName
答案 1 :(得分:0)
听起来像经典的群集MSMQ问题。
Clustering MSMQ applications – rule #1
您没有指定运行应用的位置。例如,如果"存在('。\ private $ \ MyTestQueue')"返回True然后表示MSMQ服务在本地运行到您的测试。因此,如果您在节点上从命令提示符运行测试,那么您正在与节点上的MSMQ进行通信 - 而不是群集。您需要从群集命令提示符运行测试,而不是使用群集MSMQ服务。