我正在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个连接。我怎样才能将这两个值联系起来?这是每个队列处理的多线程连接,如果是,我如何找到它们之间的关系?
答案 0 :(得分:2)
DIS CHS
命令将显示正在运行的通道实例数,这实际上是在客户端和队列管理器之间建立了多少个TCP会话。
MQ v7.0.1及更高版本支持每个通道内的共享对话。每次应用程序与队列管理器建立连接时,这可以是同一通道实例中的另一个对话。客户端和服务器可以设置最大共享连接数。在队列管理器SVRCONN
上,属性为SHARECNV
,在客户端上它可以是CCDT或以编程方式。当通道启动时,客户端和服务器将协商它们之间的最低值。在DIS CHS
上,您可以添加MAXSHCNV
以查看正在运行的渠道实例与最高协商的内容以及CURSHCNV
以查看每个渠道实例中正在运行的对话数量。
带有DIS QS
的{{1}}命令只会显示应用程序在您运行命令的时间点对该队列打开句柄的连接。
应用程序可以在没有打开队列的情况下连接到队列管理器,或者它可以打开和关闭队列,如果你没有抓住队列打开,你就不会看到句柄。< / p>
显示通道正在执行的操作的更准确的命令是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'
命令中的句柄数相匹配。
您可能有一个应用程序在一个连接上浏览队列以查找消息,然后调度到其他线程以实际处理消息。在你的情况下,7个通道实例可能为BROWSE打开队列,而另外7个实例将等待打开队列以便INPUT读取消息。
下面是我在Linux上使用的一个命令,它会发出DIS QS
命令的CSV格式以及每个打开的对象。
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'
对象可以是QMGR本身,QUEUE,TOPIC等。如果相同的CONN打开多个对象,则CONN ID将在输出行中重复。如果CONN没有打开任何对象,您将看到一行没有在行尾列出的对象,如果至少有一个对象打开,则不会有代表任何对象的行: