我在IBM MQ v8上执行了两个mqsc命令,以找出App1在队列管理器QMGR上建立的连接数,并在一个名为CONNAME的属性上发现输出值之间的差异。
echo 'dis chs('APP1.SVRCONN.CHL')'| runmqsc QMGR | grep CONNAME这一次我得到了14个IP作为CONNAME
echo 'dis qs(APP1.QUEUE) type(handle) All where(CHANNEL eq 'APP1.SVRCONN.CHL')'| runmqsc QMGR | grep CONNAME当我检查由App1通道连接的唯一App1队列上的句柄数时,只有7个IP作为CONNAME
因此,App1队列上有7个句柄,但是队列管理器上的App1通道有14个连接。我如何将这两种价值观联系起来?这是每个队列句柄上的多线程连接吗?如果是的话,我如何找到它们之间的关系?
发布于 2018-05-22 21:44:03
DIS CHS命令将显示运行多少个通道实例,这实际上是在客户端和队列管理器之间建立了多少TCP会话。
MQV7.0.1及更高版本支持每个通道内的共享会话。每次应用程序连接到队列管理器时,这都可以是同一个通道实例中的另一个会话。客户端和服务器可以设置最大数量的共享连接。在队列管理器的SVRCONN上,属性是SHARECNV,在客户机上,它可以在CCDT中或编程中。当通道启动时,客户机和服务器将协商到它们之间的最低值。在DIS CHS上,您可以添加MAXSHCNV以查看正在运行的通道实例协商的最大值是多少,CURSHCNV则可以查看每个通道实例中有多少会话正在运行。
带有DIS QS的TYPE(HANDLE)命令将只显示应用程序在运行命令时打开该队列的句柄的连接。
应用程序可以在不打开队列的情况下连接到队列管理器,或者它可以打开和关闭队列,如果没有在队列打开时捕捉到队列管理器,则不会看到句柄。
更准确的命令是DIS CONN,它将显示所有连接,每个连接代表一个会话,因此连接的数量应该与来自所有通道实例的CURSHCNV总数相匹配。
下面的命令将显示通过指定名称的通道运行的所有连接。
echo "DIS CONN(*) TYPE(ALL) WHERE(CHANNEL EQ APP1.SVRCONN.CHL)"|runmqsc QMGR输出可能如下所示:
AMQ8276: Display Connection details.
CONN(ABABABABABABABAB)
EXTCONN(ABABABABABABABABABABABABABABABAB)
TYPE(*)
PID(99998) TID(998)
APPLDESC(WebSphere MQ Channel) APPLTAG(App1)
APPLTYPE(USER) ASTATE(NONE)
CHANNEL(APP1.SVRCONN.CHL) CLIENTID( )
CONNAME(10.10.10.10)
CONNOPTS(MQCNO_HANDLE_SHARE_BLOCK,MQCNO_SHARED_BINDING)
USERID(appuser) UOWLOG( )
UOWSTDA( ) UOWSTTI( )
UOWLOGDA( ) UOWLOGTI( )
URTYPE(QMGR)
EXTURID(XA_FORMATID[] XA_GTRID[] XA_BQUAL[])
QMURID(0.0) UOWSTATE(NONE)
AMQ8276: Display Connection details.
CONN(BABABABABABABABA)
EXTCONN(BABABABABABABABABABABABABABABABA)
TYPE(*)
PID(99999) TID(999)
APPLDESC(WebSphere MQ Channel) APPLTAG(App1)
APPLTYPE(USER) ASTATE(STARTED)
CHANNEL(APP1.SVRCONN.CHL) CLIENTID( )
CONNAME(10.10.10.10)
CONNOPTS(MQCNO_HANDLE_SHARE_BLOCK,MQCNO_SHARED_BINDING)
USERID(appuser) UOWLOG( )
UOWSTDA(2018-05-21) UOWSTTI(10.11.27)
UOWLOGDA( ) UOWLOGTI( )
URTYPE(QMGR)
EXTURID(XA_FORMATID[] XA_GTRID[] XA_BQUAL[])
QMURID(0.99999) UOWSTATE(ACTIVE)
OBJNAME(APP1.QUEUE) OBJTYPE(QUEUE)
ASTATE(ACTIVE) HSTATE(INACTIVE)
OPENOPTS(MQOO_INPUT_SHARED,MQOO_BROWSE,MQOO_INQUIRE,MQOO_SAVE_ALL_CONTEXT,MQOO_FAIL_IF_QUIESCING)
READA(NO)在上面的输出中,CONN(ABABABABABABABAB)只连接到队列管理器,没有打开对象,而CONN(BABABABABABABABA)连接到队列管理器并打开了队列APP1.QUEUE。
如果要在上面的命令中添加|grep 'APP1.QUEUE',计数应该与DIS QS命令中的句柄数相匹配。
您可能有一个应用程序,它浏览一个连接上的队列以查找消息,然后向其他线程分派实际处理消息。在您的示例中,7个通道实例可能打开队列以供浏览,而其他7个将等待打开队列以输入以读取消息。
下面是我在Linux上使用的命令,它将显示DIS CONN命令的CSV格式以及打开的每个对象。
echo "DIS CONN(*) TYPE(ALL) WHERE(CHANNEL EQ CHL_NAME)"|runmqsc QMGR|grep -o '^\w\+:\|\w\+[(][^)]\+[)]' | awk -F '[()]' -v OFS='","' 'function printValues() { if ("CONN" in p) { print p["CONN"], p["CHANNEL"], p["APPLTAG"], p["USERID"], p["CONNAME"], p["OBJNAME"], p["OBJTYPE"], p["OPENOPTS"] } } /^\w+:/ { if (x !~ /YES/) {printValues()}; x = "NO"; delete p; next } { p[$1] = $2 } { if ("OPENOPTS" in p) { printValues() ; delete p["OPENOPTS"]; x = "YES"} } END { if (x !~ /YES/) {printValues()} }'|sed -e 's/^/"/g' -e 's/$/"/g'CSV输出中的字段是:
"CONN","CHANNEL","APPLTAG","USERID","CONNAME","OBJNAME","OBJTYPE","OPENOPTS"对象可以是QMGR本身、队列、主题等。如果同一个CONN打开了多个对象,那么CONN id将在输出的行中重复。如果CONN没有打开对象,您将看到一行末尾没有列出对象的单个条目,如果至少打开了一个对象,则不会有代表任何对象的行:
https://stackoverflow.com/questions/50475063
复制相似问题