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

时间:2017-02-02 09:54:12

标签: ibm-mq

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

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.

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

1 个答案:

答案 0 :(得分:2)

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

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

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

    上述命令只应显示指定群集中的队列,而-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之前,您必须获取原始队列名称

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

      grep -o -P&#34;(?&lt; = QUEUE)(。+?)&#34; | sed -e&#39; s / [(|)] // g

    2. 如果我们在上一个命令中添加它,我们得到:

      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>

      2. 将整个事情放在一起应该会得到类似的东西:

        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脚本更好地做到这一点,你可以在每个步骤之间添加检查以确保你能够做到这一点。不要对你不想做的队列做些什么。

        在测试时,您可以使用-v上的runmqsc标记,因为这将验证命令而不执行操作 - 因此您可以看到输出和runmqsc将告诉您是否存在任何问题,不要马上做。