Вызов IBM MQ завершился неудачей с компкодом '2' ('MQCC_FAILED'), причина '2035'
('MQRC_NOT_AUTHORIZED'). JMSWMQ2013: Аутентификация безопасности была
недействительной, которая была предоставлена для администратора очередей «
Мой класс конфигурации
Код: Выделить всё
@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: Ошибка инициализации идентификатора пользователя диспетчера очередей для «мого системного
идентификатора пользователя». ОБЪЯСНЕНИЕ: Вызов для инициализации идентификатора пользователя «my system
user id» завершился неудачно с CompCode 2 и причиной 2035. Если использовался блок MQCSP
, идентификатор пользователя в блоке MQCSP был «имя пользователя из свойства». '. Если использовался поток userID
, идентификатор пользователя в заголовке UID был «идентификатор моего системного пользователя»
и все правила CHLAUTH, примененные до принятия пользователем, оценивались
с учетом регистра по этому значению. . ДЕЙСТВИЕ: Исправьте ошибку и повторите попытку
еще раз.
Факты
Имя пользователя и пароль верен, другие приложения используют те же учетные данные.
Решение опробовано и сработало
Мне удалось решить проблему с помощью ниже два метода:-
- Установка значения false для setUserAuthenticationMQCSP
- Установка System.property("user.name", "имя пользователя" от собственности") при запуске
Два приведенных выше решения кажутся хакерскими и на самом деле не решают реальную проблему.
- Почему два вышеуказанных решения сработали?
- Почему мой системный идентификатор пользователя используется для аутентификации соединения с IBM MQ? Как обеспечить аутентификацию соединения только с использованием переданных учетных данных?
Подробнее здесь: https://stackoverflow.com/questions/791 ... eason-2035