IBM MQ统一集群队列管理器WAS环境下故障转移异常咨询
我有一个JEE应用(简单EJB应用,用于向队列发送消息),需连接至统一集群队列管理器(QMC1、QMC2)并发送消息。该应用运行于WebSphere Application Server(WAS),使用CCDT,通过以下命令将队列管理器归为一组:
DEFINE CHANNEL(QMC1.CHL) CHLTYPE(CLNTCONN) CONNAME('192.168.1.12(9001)') QMNAME(QM) AFFINITY(NONE) TRPTYPE(TCP) REPLACE DEFINE CHANNEL(QMC2.CHL) CHLTYPE(CLNTCONN) CONNAME('192.168.1.12(9002)') QMNAME(QM) AFFINITY(NONE) TRPTYPE(TCP) REPLACE
我已将连接工厂的队列管理器名称设置为*QM,且在WAS的连接工厂→高级属性→客户端重连选项中选择了RECONNECT。
当前问题:当两个队列管理器均运行时,我可向单个队列发送消息(已提高队列工作负载优先级,使所有消息发往集群中的QMC1队列);但QMC1宕机后,JEE应用无法连接至存活的QMC2,而是尝试重连QMC1,未基于队列管理器组选择可用节点。
请问我是否存在理解误区?RECONNECT是否仅尝试重连原队列管理器而非基于CCDT选择可用节点?统一集群队列管理器是否应通过CCDT队列管理器组支持该故障转移行为?
关于RECONNECT的行为误区
你对RECONNECT的理解确实存在偏差:WAS中MQ连接工厂的RECONNECT选项仅针对原连接的队列管理器进行重连尝试,不会自动回到CCDT的队列管理器组中选择其他可用节点。它的核心作用是在与原QM的连接意外中断后,尝试重建和该QM的连接,而非实现跨QM的故障转移。
统一集群QM的故障转移实现方式
统一集群队列管理器确实支持通过CCDT组实现故障转移,但需要结合正确的配置和WAS的特定设置:
- CCDT配置验证:你的CCDT命令中
QMNAME(QM)将两个CLNTCONN通道归为同一逻辑QM组,这部分是正确的,但需要确保WAS能正确加载最新的CCDT文件,且连接工厂的队列管理器名称设置为*QM(你已完成这一步)。 - 启用WAS的
CLIENTRECONNECTOPTIONS扩展属性:仅设置RECONNECT不够,需要在连接工厂的自定义属性中添加CLIENTRECONNECTOPTIONS,值设为RECONNECT_Q_MGR。这个属性会让客户端在原QM不可用时,从CCDT的同组QM中选择可用节点进行重连。 - 连接工厂的连接池设置:如果WAS连接池持有了原QM的失效连接,需要调整连接池的
连接超时和失效连接检测参数(比如启用Validate New Connections或Validate Existing Connections),确保池中的失效连接被及时清理,新请求能触发从CCDT组中选择新的QM。 AFFINITY(NONE)的作用:你在CCDT中设置了AFFINITY(NONE),这确保了客户端不会绑定到特定QM,为跨QM故障转移提供了基础,这部分配置是正确的。
总结
要实现你期望的故障转移,需在WAS连接工厂中补充配置CLIENTRECONNECTOPTIONS=RECONNECT_Q_MGR,配合已有的CCDT组配置和*QM队列管理器名称设置,才能让应用在原QM宕机时自动切换到同组的可用QM。
内容的提问来源于stack exchange,提问作者Yasothar

