如何检查IBM MQ for Linux中是否存在队列名称?

时间:2017-01-26 15:31:32

标签: ibm-mq

if [[ $(dspmq | grep '(Running)' | grep "$QMgr" | wc -l | tr -d " ") != 1 ]]

上面的代码是检查队列管理器是否正在运行。

是否有任何命令检查队列管理器中是否存在给定的队列名称?

3 个答案:

答案 0 :(得分:4)

除了Rob和T.Rob所说的之外,还添加了另一个建议。

MQ v7.1及更高版本附带dmpmqcfg命令,您可以使用它来检查特定队列。

以下示例与您的示例一致,该示例检查队列管理器是否正在运行:

要使用dmpmqcfg检查是否存在任何类型的队列名称,您可以这样做:

if dmpmqcfg -m ${QMgr} -t queue -x object -o 1line -n ${QName}|egrep '^DEFINE '; then
  echo "Queue ${QName} exists on Queue Manager ${QMgr}
fi

使用方法Rob Parker提供*来检查是否存在任何类型的队列名称:
*注意我使用DISPLAY Q(代替DISPLAY QLOCAL(

if printf "DISPLAY Q(${QName})" | runmqsc ${QMgr} 2>&1 >/dev/null; then
  echo "Queue ${QName} exists on Queue Manager ${QMgr}
fi

您的示例检查队列管理器运行可以简化为:

if dspmq -m ${QMgr}| grep --quiet '(Running)'; then
  echo "Queue Manager ${QMgr} is Running"
fi

答案 1 :(得分:3)

没有特定的命令,但您可以使用:

printf "DISPLAY QLOCAL(<QUEUE NAME>)" | runmqsc <QM Name>

如果不存在,您将获得 10 的退货代码,如果不存在,则 0 。有一点需要注意,队列管理器必须正在运行,您必须以有权访问相关队列管理器的人身份运行该命令,否则您将获得不同的返回码! (20个队列管理器未运行且未经授权)

鉴于您没有指定特定的队列类型,我假设您正在寻找QLocal,但您可以通过修改上述命令搜索任何队列类型。

答案 2 :(得分:2)

除了Rob所说的,以编程方式执行此操作的方法是尝试打开队列。如果队列存在,您将获得RC=0RC=2,其原因代码为2035 MQRC_NOT_AUTHORIZED。如果队列不存在,您将返回RC=2,原因代码为2085 MQRC_UNKNOWN_OBJECT_NAME

如果其他人将该队列打开以进行独占输入,则无法在没有出现错误的情况下打开它进行输入,但至少错误会告诉您队列存在。要解决这个问题,请打开队列进行查询,如果你需要的只是知道它存在。这也允许您使用API​​的查询选项发现有关它的其他属性。

最后,如果您有权访问命令队列,则可以在其上删除与Rob提到的DIS Q(<QUEUE NAME>)相当的PCF命令。通常,业务应用程序不需要访问命令队列,但是业务应用程序通常不需要询问它们的队列是否存在。这是一个管理功能,应用程序找到其队列或引发致命错误。作为MQ管理员,我会质疑任何要求使用runmqsc的权利的商业应用程序,或询问其队列是否在那里,其渠道是否已启动等等。我工作过的大多数商店都不会让使用该设计或特权将业务应用程序转换为生产。

另一方面,检测应用程序通常需要能够查询队列清单等内容,以便能够访问和使用该功能的命令队列,或者可以访问runmqsc来查询来自剧本。