如何使用 linux 从 IBM MQ 队列管理器中的集群中删除所有队列?

How to remove all queues from cluster in queue manager in IBM MQ using linux?

我已使用以下命令删除队列管理器中集群中的所有队列

echo "ALTER QLOCAL(*) CLUSTER('') CLUSNL('')" | runmqsc ${qmgr}.

我得到的错误是 1 : ALTER QLOCAL(*) CLUSTER('') CLUSNL('') AMQ8147: WebSphere MQ object * not found. One MQSC command read. No commands have a syntax error. One valid MQSC command could not be processed.

我的需要是删除队列管理器中集群中的所有队列。提前致谢

更改 MQ 对象时不能使用通配符 (*)。相反,您必须指定要更改的确切对象,并且该对象必须存在。这就是您的命令失败的原因(因为它正在寻找一个名为 * 的对象,该对象不存在。

如果您想更改多个对象,您必须使用支持此功能的第三方工具,或者您必须以编程方式进行。如果您选择以编程方式执行此操作,您的程序必须执行以下操作

  1. 向您的队列管理器查询您要更改的对象。这可以使用 echo "DISPLAY QLOCAL(*) CLUSTER(<cluster name>)" | runmqsc -e <QMNAME>
  2. 来完成

以上命令应该只显示指定集群中的队列,-e 选项意味着您不会在输出中看到 1 : DISPLAY QLOCAL(*) CLUSTER(<cluster name>)。但是,如果命令 returns any objects 你会得到类似的输出并且你会得到一个 return code of 0:

5724-H72 (C) Copyright IBM Corp. 1994, 2016.
Starting MQSC for queue manager ROB.


AMQ8409: Display Queue details.
   QUEUE(LOCAL)                            TYPE(QLOCAL)
   CLUSTER(<cluster name>)
AMQ8409: Display Queue details.
   QUEUE(QL)                               TYPE(QLOCAL)
   CLUSTER(<cluster name>)

如果该命令找不到任何队列,您将看到以下错误,并且您将获得 return 代码 0:

5724-H72 (C) Copyright IBM Corp. 1994, 2015.
Starting MQSC for queue manager QMROB.


AMQ8147: WebSphere MQ object * not found.
One MQSC command read.
No commands have a syntax error.
One valid MQSC command could not be processed.

因此,在将队列名称通过管道返回 runmqsc 之前,您必须获取原始队列名称

  1. Trim 输出以删除除 Q 名称之外的所有内容。这可以通过多种方式完成,但我个人会使用 grep 和 sed 。首先,我们只想要带有 QUEUE 的行,因此我们使用 grep 删除 QUEUE 之后除了圆括号(及其内容)之外的所有内容。然后我们使用 sed 删除圆括号。你最终得到这样的结果:

    grep -o -P "(?<=QUEUE)(.+?)" | sed -e 's/[(|)]//g

如果我们将其添加到我们之前的命令中,我们将得到:

echo "DISPLAY QLOCAL(*) CLUSTER(<cluster name>)" | runmqsc -e <QMNAME> | grep -o -P "(?<=QUEUE)\(.+?\)" | sed -e 's/[(|)]//g

这给了我们输出:

LOCAL
QL
  1. 最后我们想将它推回 runmqsc 以根据需要更改所有队列,我们​​可以使用 xargs 来完成此操作。我们想通过 xargs 两次推送它,因为第一个将确保每个队列名称作为一个单独的命令通过,并由第二个命令执行:

    xargs -n 1 | xargs -I {} echo "ALTER QUEUE({}) CLUSTER('') CLUSNL('')" | runmqsc <QM Name>

把所有的东西放在一起应该会让你得到这样的东西:

echo "DISPLAY QLOCAL(*) CLUSTER(<cluster name>)" | runmqsc -e <QMNAME> | grep -o -P "(?<=QUEUE)\(.+?\)" | sed -e 's/[(|)]//g | xargs -n 1 | xargs -I {} echo "ALTER QUEUE({}) CLUSTER('') CLUSNL('')" | runmqsc <QM Name>

当然,以上只是一个如何在一行中完成的示例,但是通过 shell 脚本来完成会更好,您可以在每个步骤之间添加检查确保您不会对队列执行您不想执行的操作。

在测试时你也可以在 runmqsc 上使用 -v 标志,因为这将验证命令而不执行操作 - 所以你可以看到输出并且 runmqsc 会告诉你是否有有任何问题,不立即做。