更改 MQ 对象时不能使用通配符 (*)。相反,您必须指定要更改的确切对象并且该对象必须存在。这就是您的命令失败的原因(因为它正在寻找一个名为 * 的对象,该对象不存在。
如果您想更改多个对象,您必须使用支持此功能的第三方工具,或者您必须以编程方式进行。如果您选择以编程方式执行此操作,您的程序必须执行以下操作
- 在队列管理器中查询您要更改的对象。这可以使用
echo "DISPLAY QLOCAL(*) CLUSTER(<cluster name>)" | runmqsc -e <QMNAME> 来完成
上面的命令应该只显示指定集群中的队列,-e 选项意味着你不会在输出中看到1 : DISPLAY QLOCAL(*) CLUSTER(<cluster name>)。但是,如果该命令返回任何对象,您将获得类似的输出,并且您将获得返回码 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>)
如果该命令未能找到任何队列,但是您将看到以下错误并且您将获得返回码 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 之前,您必须获取原始队列名称
-
修剪输出以删除除 Q 名称之外的所有内容。这可以通过多种方式完成,但我个人会使用 grep 和 sed 。首先,我们只想要上面有QUEUE 的行,所以我们使用 grep 删除除 QUEUE 之后的圆括号(及其内容)之外的所有内容。然后我们使用 sed 删除圆括号。你最终会得到这样的结果:
grep -o -P "(?
如果我们将它添加到我们之前的命令中,我们会得到:
echo "DISPLAY QLOCAL(*) CLUSTER(<cluster name>)" | runmqsc -e <QMNAME> | grep -o -P "(?<=QUEUE)\(.+?\)" | sed -e 's/[(|)]//g
这给了我们输出:
LOCAL
QL
-
最后我们想将它推回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 会告诉您是否有任何问题,而无需执行立即地。