如何检查 linux 的 IBM MQ 中是否已经存在队列名称?

How to check whether already queue name is exists or not in IBM MQ for linux?

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

以上代码用于检查队列管理器是否为运行。

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

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

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

如果不存在,您将获得 Return 代码 10,如果存在,您将获得 0。需要注意的一件事是,队列管理器必须 运行ning 并且您必须 运行 作为有权访问相关队列管理器的人执行命令,否则您将获得不同的 return 代码! (20 队列管理器未 运行ning 且未授权)

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

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

如果其他人为独占输入打开了该队列,您将无法打开它进行输入而不会出现错误,但至少该错误会告诉您该队列存在。要解决这个问题,请打开查询队列(如果您只需要知道它存在)。这也让您可以通过 API 的查询选项发现有关它的其他属性。

最后,如果您有权访问命令队列,则可以在其上放置一个 PCF 命令,相当于 Rob 提到的 DIS Q(<QUEUE NAME>)。通常,业务应用程序不需要访问命令队列,但业务应用程序通常也不需要查询其队列是否存在。这是一个管理功能,应用程序要么找到它的队列,要么抛出一个致命错误。作为 MQ 管理员,我会质疑任何要求使用 runmqsc 的权限或询问其队列是否存在、通道是否已启动等的业务应用程序。我工作过的大多数商店都不会让使用该设计或权限将业务应用程序投入生产。

另一方面,检测应用程序通常需要能够查询诸如队列库存之类的东西,因此预计可以访问并使用命令队列来实现该功能,或者可以访问 runmqsc从脚本中查询。

除了 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