IBM MQ中CONNS与CURSHCNV值一致问题及连接会话验证咨询
IBM MQ物理连接与逻辑会话验证问题解答
问题背景
你对IBM MQ连接的定义理解正确:
- 物理连接:与队列管理器之间的TCP连接
- 逻辑连接(会话):JMS会话或MQ对话
测试场景:
- JMS场景:创建1个JMS连接,基于它生成5个会话
- MQ基础API场景:创建5个
MQQueueManager实例(独立物理连接)
使用的MQ命令:
- 查看队列管理器连接数:
DISPLAY QMSTATUS CONNS - 查看通道活跃对话数:
DISPLAY CHSTATUS(SYSTEM.DEF.SVRCONN) CURSHCNV
问题现象:两种场景下返回结果一致,均为CONNS(5)和CURSHCNV(5),但预期JMS场景应是CONNS(1)、CURSHCNV(5)。
通道配置:SHARECNV(10)(允许单个TCP连接上最多建立10个对话)
疑问1:为何单个JMS连接创建多会话时,CONNS与CURSHCNV值相同?
核心原因是IBM MQ JMS客户端默认未启用对话共享,即便你基于同一JMS连接创建多个会话,客户端仍会为每个会话单独建立新的物理TCP连接,而非复用已有连接生成逻辑对话。
只有当JMS客户端明确配置允许共享对话(SHARECNV),且与队列管理器的通道配置(SHARECNV参数)匹配时,才会在单个物理连接上生成多个逻辑对话,此时CONNS(物理连接数)和CURSHCNV(对话数)才会出现差异。
疑问2:JMS客户端是否实际创建了多个物理连接而非复用会话?
是的。默认配置下,IBM MQ JMS客户端的每个JMS会话都会对应一个独立的物理TCP连接,而非复用同一JMS连接的物理链路创建逻辑会话。这就是JMS场景中CONNS和CURSHCNV都显示为5的原因——每个会话都占用了一个物理连接和一个对话。
要让JMS客户端复用物理连接创建多会话,需在JMS连接工厂中设置以下属性:
connectionFactory.setIntProperty(WMQConstants.WMQ_SHARE_CONV_ALLOWED, WMQConstants.WMQ_SHARE_CONV_ALLOWED_YES);
该配置会允许客户端在单个TCP连接上创建多个逻辑对话,匹配队列管理器通道的SHARECNV设置。
疑问3:如何正确验证IBM MQ中的物理TCP连接与逻辑会话数量?
1. 验证物理TCP连接数量
MQ命令层面:
使用DISPLAY CHSTATUS查看所有客户端通道的实例数,每个通道实例对应一个物理TCP连接:DISPLAY CHSTATUS(*) CONN统计输出中
CHANNEL(xxx)条目的总数,即为物理连接数。操作系统层面:
- Linux/Unix:用
ss或netstat统计与队列管理器监听端口(默认1414)的TCP连接数:ss -t | grep :1414 | wc -l - Windows:用
netstat命令统计:netstat -ano | findstr ":1414" | findstr "ESTABLISHED" | find /c /v ""
- Linux/Unix:用
2. 验证逻辑会话(对话)数量
- MQ命令层面:
针对指定客户端通道,查看CURSHCNV参数值,该值代表当前通道实例上的活跃对话数:
若要查看所有通道的活跃对话数,可使用:DISPLAY CHSTATUS(SYSTEM.DEF.SVRCONN) CURSHCNV
将所有DISPLAY CHSTATUS(*) CURSHCNVCURSHCNV数值求和,即为总逻辑会话数。
内容的提问来源于stack exchange,提问作者Muskaan
相关产品推荐
相关产品推荐

