You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring连接IBM MQ报2035未授权错误的原因及疑问

IBM MQ连接2035认证失败问题分析

问题现象

IBM MQ调用失败,compcode '2' ('MQCC_FAILED'),reason '2035' ('MQRC_NOT_AUTHORIZED')。JMSWMQ2013: 为队列管理器''提供的安全认证无效,连接模式为'Client',主机名为'()'。

项目配置代码

配置类

@Bean
public JmsTemplate jmsTemplate() throws JMSException {
    MQQueueConnectionFactory mqQueueConnectionFactory = mqQueueConnectionFactory();
    UserCredentialsConnectionFactoryAdapter userCredentialsConnectionFactoryAdapter =
            getUserCredentialsConnectionFactoryAdapter(mqQueueConnectionFactory);
    JmsTemplate jmsTemplate = new JmsTemplate(userCredentialsConnectionFactoryAdapter);
    jmsTemplate.setReceiveTimeout(Long.parseLong(receiveTimeout));
    return jmsTemplate;
}

@Bean
public MQQueueConnectionFactory mqQueueConnectionFactory() throws JMSException {
    MQQueueConnectionFactory mqQueueConnectionFactory = new MQQueueConnectionFactory();
    mqQueueConnectionFactory.setHostName(hostname);
    mqQueueConnectionFactory.setTransportType(WMQConstants.WMQ_CM_CLIENT);
    mqQueueConnectionFactory.setUserAuthenticationMQCSP(Boolean.parseBoolean(userMQCSPAuthValue));
    mqQueueConnectionFactory.setChannel(channel);
    mqQueueConnectionFactory.setPort(port);
    mqQueueConnectionFactory.setQueueManager(queueManager);
    mqQueueConnectionFactory.setClientReconnectOptions(WMQConstants.WMQ_CLIENT_RECONNECT);
    mqQueueConnectionFactory.setClientReconnectTimeout(Integer.parseInt(reconnectTimeout));
    return mqQueueConnectionFactory;
}

@Bean
public UserCredentialsConnectionFactoryAdapter getUserCredentialsConnectionFactoryAdapter(
        MQQueueConnectionFactory mqQueueConnectionFactory) {
    UserCredentialsConnectionFactoryAdapter userCredentialsConnectionFactoryAdapter =
            new UserCredentialsConnectionFactoryAdapter();
    userCredentialsConnectionFactoryAdapter.setUsername(username);
    userCredentialsConnectionFactoryAdapter.setPassword(password);
    userCredentialsConnectionFactoryAdapter.setTargetConnectionFactory(mqQueueConnectionFactory);
    return userCredentialsConnectionFactoryAdapter;
}

消息收发代码

TextMessage message = (TextMessage) jmsTemplate.sendAndReceive(destinationMq, session -> {
                TextMessage textMessage = session.createTextMessage(request);
                textMessage.setJMSCorrelationID(correlationId);
                textMessage.setJMSReplyTo(getMQ(replyToQueue));
                return textMessage;
            });

服务器端日志

AMQ9557E: 队列管理器用户ID 'my system user id'初始化失败。说明:初始化用户ID 'my system user id'的调用失败,CompCode 2,Reason 2035。如果使用了MQCSP块,则MQCSP块中的用户ID为'username from property'。如果使用了用户ID流,则UID头中的用户ID为'my system user id',任何在用户采用前应用的CHLAUTH规则都会对此值进行区分大小写的评估。操作:纠正错误并重试。

已知事实

  • 配置的用户名和密码正确,其他应用使用相同凭据可正常连接IBM MQ

已生效的临时解决方案

  • 将setUserAuthenticationMQCSP的参数值设置为false
  • 应用启动时设置系统属性:System.property("user.name", "配置的用户名")

核心疑问

  1. 为什么上述两种临时解决方案能够生效?
  2. 为何连接IBM MQ时会使用系统用户ID进行认证?如何确保仅使用配置中传入的用户名和密码完成认证?

内容的提问来源于stack exchange,提问作者dope

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 06:36:20