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

Ibm mq 如何检查IBM MQ for linux中是否已经存在队列名称?,ibm-mq,Ibm Mq,if[[$(dspmq | grep'(Running)| grep“$QMgr”| wc-l | tr-d”!=1] 上面的代码用于检查队列管理器是否正在运行 是否有命令检查队列管理器中是否存在给定的队列名称?没有特定的命令,但您可以使用: printf "DISPLAY QLOCAL(<QUEUE NAME>)" | runmqsc <QM Name> printf“DISPLAY QLOCAL()”| runmqsc 如果返回码不存在,则返回码为10;如果返回码

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

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


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

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

printf "DISPLAY QLOCAL(<QUEUE NAME>)" | runmqsc <QM Name>
printf“DISPLAY QLOCAL()”| runmqsc
如果返回码不存在,则返回码为10;如果返回码存在,则返回码为0。需要注意的一点是,队列管理器必须正在运行,并且您必须作为有权访问相关队列管理器的人来运行该命令,否则您将得到不同的返回码!(20对于未运行且未授权的队列管理器)


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

除了Rob所说的,以编程方式执行此操作的方法是尝试打开队列。如果队列存在,您将获得原因码为2035的
MQRC\u NOT\u AUTHORIZED
RC=0
RC=2
。如果队列不存在,则返回原因码为2085的
MQRC\u UNKNOWN\u OBJECT\u NAME

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

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


另一方面,检测应用程序通常需要能够查询队列资源清册之类的内容,以便能够访问并使用命令队列执行该功能,或者能够访问
runmqsc
从脚本进行查询。

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

mqv7.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提供的方法*检查是否存在任何类型的队列名称:
*注:我使用了
displayq(
而不是
displayqlocal(

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

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

请注意,如果您询问的是与IBM MQ产品相关的问题,则只需放置标记[IBM MQ]。标记[websphere]用于与websphere Application Server相关的问题。标记[MQ]用于一般消息队列问题。标记[IBM]标签是关于IBM公司的问题。它运行良好@JoshMcDamn Josh,你从我和Rob的手下拔出了这个标签!我想你已经掌握了窍门。;-)
if dspmq -m ${QMgr}| grep --quiet '(Running)'; then
  echo "Queue Manager ${QMgr} is Running"
fi