使用IBM MQ Java客户端连接时遭遇2035未授权错误(队列管理器查询权限缺失)
IBM MQ Java客户端连接时遭遇2035未授权错误(队列管理器查询权限缺失)
看起来你遇到的问题是IBM MQ Java客户端的默认行为导致的——默认情况下,客户端在建立连接时会自动尝试查询队列管理器的属性,这就要求你的用户拥有队列管理器的inq(查询)权限,而你目前只有队列的操作权限,所以触发了2035未授权错误。
好消息是,这个查询操作并不是发送/接收消息的必须步骤,你可以通过调整连接工厂的设置来跳过它,具体方法如下:
解决方案:禁用队列管理器属性查询
在你的连接工厂配置代码中,添加一行关键设置来阻止客户端查询队列管理器属性:
MQQueueConnectionFactory factory = new MQQueueConnectionFactory(); factory.setHostName("myserver"); factory.setPort(1451); factory.setQueueManager("TIPPP"); factory.setChannel("TIPPP.CL.GGG"); factory.setTransportType(WMQConstants.WMQ_CM_CLIENT); factory.setUserAuthenticationMQCSP(true); // 关键设置:跳过队列管理器属性查询,避免需要inq权限 factory.setSuppressQMgrAttributesInquire(true);
你也可以通过属性常量的方式设置:
factory.setBooleanProperty(WMQConstants.WMQ_SUPPRESS_QMGR_ATTR_INQUIRE, true);
为什么这个方法有效?
这个设置会告诉Java客户端不要在连接阶段发起队列管理器属性查询请求,这样就不会触发对队列管理器的inq权限检查。而你已经拥有目标队列的操作权限,完全不影响后续的消息发送和监听功能。
你的MQ版本是9.4.1.1,完全支持这个设置(该特性从IBM MQ 9.1.0版本就已引入),之前你尝试不同的Factory都不行,是因为所有标准的IBM MQ Java客户端Factory默认都会执行这个查询操作,必须显式禁用。
验证效果
设置完成后重新连接,管理员那边不会再收到AMQ8077W的权限警告,你也能正常建立连接,完成消息的发送和队列监听工作。
备注:内容来源于stack exchange,提问作者Otis Ottington
相关产品推荐
相关产品推荐

