【问题标题】:Get-MsmqQueue does not find queues in clusterGet-MsmqQueue 在集群中找不到队列
【发布时间】:2019-10-31 17:47:54
【问题描述】:

我有一个 2 节点集群,在 Windows Server 2012R2 上安装了 PowerShell 4.0 版。集群中的角色之一是“Messaging Queuing”,名为“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')

返回真

是否有人知道为什么 MSMQ cmdlet 找不到队列,但 .net 程序集可以,并且计算机管理管理单元也能看到队列?

需要明确的是,本地节点或物理节点上没有定义队列。 “private$\MyTestQueue”仅在 MSMQ 安装角色“TESTMSMQ”上定义。

所以,如果 Exists() 使用 localhost 名称返回 True,那么我会假设环境是 MSMQ 角色,而不是物理节点。

【问题讨论】:

    标签: powershell cluster-computing msmq


    【解决方案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
    

    【讨论】:

    • 这在 2019 年对我来说也非常有效 - 只需将 $env:computername 设置为集群名称
    【解决方案2】:

    听起来像是经典的集群 MSMQ 问题。

    Clustering MSMQ applications – rule #1

    您没有指定运行应用程序的位置。例如,如果“Exists('.\private$\MyTestQueue')”返回 True,则意味着 MSMQ 服务正在本地运行以进行测试。因此,如果您从节点上的命令提示符运行测试,您正在与节点上的 MSMQ 对话,而不是集群。您需要从集群命令提示符运行测试,而不是使用集群 MSMQ 服务。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 2018-01-14
    相关资源
    最近更新 更多