I have WebSphere MQ and WebSphere Message Broker installed on Linux and when I execute mqsicreateexecutiongroup
I get an error saying:
BIP1046E: Unable to connect with the queue manager (Could not connect to queue manager ‘NSPZPAI1’ (MQ reason code 2538)).
When I search for this reason code I understand that it is a host not available error.
Can somebody please tell me how to resolve this error?
When I run a runmqlsr
command I always end up in a hang. Can somebody tell me how to start a listener?
T.Rob
31.5k9 gold badges59 silver badges103 bronze badges
asked Oct 16, 2012 at 9:34
Don’t start the listener by hand or script. If you have a modern queue manager, define a listener object like so:
DEF LISTENER(LISTENER.1414) TRPTYPE(TCP) +
CONTROL(QMGR) PORT(1414) +
REPLACE
START LISTENER(LISTENER.1414)
The attribute CONTROL(QMGR)
tells the QMgr to start the listener automatically when the QMgr is started and to kill the listener when the QMgr is shut down. This ensures that the listener will always be started when the QMgr comes up, even if the QMgr is started manually instead of from the usual boot script. Because the listener is a child process of the QMgr it will always come down with the QMgr so you don’t need to worry about orphaned listeners preventing connections after a QMgr restart.
Once the listener is defined, you can also use START LISTENER
or STOP LISTENER
MQSC commands to manually start and stop it independently of the QMgr. In the example above, I’ve manually started the listener rather than reboot the QMgr. Either would work but the START
command is less intrusive.
answered Oct 16, 2012 at 13:19
T.RobT.Rob
31.5k9 gold badges59 silver badges103 bronze badges
1
Listener is run using
runmqlsr -t tcp -p <port> -m <queue manager name>.
It starts the listener which waits for connections. More details on the command are here
answered Oct 16, 2012 at 10:26
ShashiShashi
14.9k2 gold badges32 silver badges51 bronze badges
I am using IBM WebSphere MQ 8.0 version.
I have configured one of my channels with «TLS_RSA_WITH_AES_256_CBC_SHA256» Cipher Spec encryption along with valid certificates installed and mapped to key store path correctly.
My .NET client code is not able to connect with this secured channel. It gives 2538 error continuously.
I have another channel configured without encryption (unsecured). The client code can connect to this channel without any errors.
This is my .NET client code:
Hashtable queueProperties = new Hashtable();
queueProperties[MQC.HOST_NAME_PROPERTY] = host; // IP address
queueProperties[MQC.PORT_PROPERTY] = 1541
queueProperties[MQC.CHANNEL_PROPERTY] = channel; // channel name
queueProperties[MQC.TRANSPORT_PROPERTY] = MQC.TRANSPORT_MQSERIES_MANAGED;
queueProperties[MQC.SSL_CERT_STORE_PROPERTY] = "*USER";
queueProperties[MQC.SSL_CIPHER_SPEC_PROPERTY] = "TLS_RSA_WITH_AES_256_CBC_SHA256";
queueProperties[MQC.SSL_PEER_NAME_PROPERTY] = "CN=FXCMTST1,O=IBM,C=US";
queueProperties["CertificateLabel"] = "ibmwebspheremqfxcmtst1";
queueProperties[MQC.KEY_RESET_COUNT] = 0;
MQEnvironment.SSLCertRevocationCheck = true;
queueProperties[MQC.USER_ID_PROPERTY] = user; // variable
queueProperties[MQC.PASSWORD_PROPERTY] = pwd; // variable
try
{
// Attempt the connection
queueManager = new MQQueueManager(qmgr, queueProperties);
strReturn = "Connected Successfully";
}
I have also set the MCA User to the valid user with all required access rights.
The above code works fine for the unsecured channel when I remove these lines and replace the channel name with that of unsecured one.
queueProperties[MQC.TRANSPORT_PROPERTY] = MQC.TRANSPORT_MQSERIES_MANAGED;
queueProperties[MQC.SSL_CERT_STORE_PROPERTY] = "*USER";
queueProperties[MQC.SSL_CIPHER_SPEC_PROPERTY] = "TLS_RSA_WITH_AES_256_CBC_SHA256";
queueProperties[MQC.SSL_PEER_NAME_PROPERTY] = "CN=FXCMTST1,O=IBM,C=US";
queueProperties["CertificateLabel"] = "ibmwebspheremqfxcmtst1";
queueProperties[MQC.KEY_RESET_COUNT] = 0;
MQEnvironment.SSLCertRevocationCheck = true;
Am I missing anything in the code or MQ configuration?
UPDATE 1:
I found that the error was due to incorrect path to key database. I had mentioned the path till folder name where the certificates were placed. However it was expected to be the folder name followed by the name of kdb file without extention.
After doing this change, the 2538 error is gone. But now I am getting 2059 error with below error message in log.
«The CipherSpec negotiated during the SSL handshake does not match the required CipherSpec for channel…»
My Channel is configured to have»TLS_RSA_WITH_AES_256_CBC_SHA256″ as I have set in the MQ Explorer. The client code is also sending the same cipher spec. Still it gives 2059 error.
UPDATE 2: As suggested by @JoshMc, I set the group policy and it resolved above error. Then I started getting error «Channel is lacking certificate».
UPDATE 3: This error is gone after I changed the SSLCAUTH to OPTIONAL. Earlier it was set to REQUIRED. Thanks to @JoshMc for pointing out.
Вопрос:
Я использую версию IBM WebSphere MQ 8.0.
Я сконфигурировал один из моих каналов с помощью шифрования Cipher Specification TLS_RSA_WITH_AES_256_CBC_SHA256 вместе с действительными сертификатами, установленными и правильно настроенными на путь хранения ключей.
Мой клиентский код.NET не может подключиться к этому защищенному каналу. Он дает ошибку 2538 непрерывно. У меня есть другой канал, настроенный без шифрования (необеспеченный). Клиентский код может подключаться к этому каналу без каких-либо ошибок.
Это мой клиентский код.NET:
Hashtable queueProperties = new Hashtable();
queueProperties[MQC.HOST_NAME_PROPERTY] = host; // IP address
queueProperties[MQC.PORT_PROPERTY] = 1541
queueProperties[MQC.CHANNEL_PROPERTY] = channel; // channel name
queueProperties[MQC.TRANSPORT_PROPERTY] = MQC.TRANSPORT_MQSERIES_MANAGED;
queueProperties[MQC.SSL_CERT_STORE_PROPERTY] = "*USER";
queueProperties[MQC.SSL_CIPHER_SPEC_PROPERTY] = "TLS_RSA_WITH_AES_256_CBC_SHA256";
queueProperties[MQC.SSL_PEER_NAME_PROPERTY] = "CN=FXCMTST1,O=IBM,C=US";
queueProperties["CertificateLabel"] = "ibmwebspheremqfxcmtst1";
queueProperties[MQC.KEY_RESET_COUNT] = 0;
MQEnvironment.SSLCertRevocationCheck = true;
queueProperties[MQC.USER_ID_PROPERTY] = user; // variable
queueProperties[MQC.PASSWORD_PROPERTY] = pwd; // variable
try
{
// Attempt the connection
queueManager = new MQQueueManager(qmgr, queueProperties);
strReturn = "Connected Successfully";
}
Я также установил для пользователя MCA действительного пользователя со всеми необходимыми правами доступа.
Вышеприведенный код отлично работает для незащищенного канала, когда я удаляю эти строки и заменяю имя канала на необеспеченный.
queueProperties[MQC.TRANSPORT_PROPERTY] = MQC.TRANSPORT_MQSERIES_MANAGED;
queueProperties[MQC.SSL_CERT_STORE_PROPERTY] = "*USER";
queueProperties[MQC.SSL_CIPHER_SPEC_PROPERTY] = "TLS_RSA_WITH_AES_256_CBC_SHA256";
queueProperties[MQC.SSL_PEER_NAME_PROPERTY] = "CN=FXCMTST1,O=IBM,C=US";
queueProperties["CertificateLabel"] = "ibmwebspheremqfxcmtst1";
queueProperties[MQC.KEY_RESET_COUNT] = 0;
MQEnvironment.SSLCertRevocationCheck = true;
Я что-то пропустил в конфигурации кода или MQ?
ОБНОВЛЕНИЕ 1: Я обнаружил, что ошибка связана с неправильным доступом к базе данных ключей. Я упомянул путь до имени папки, где были размещены сертификаты. Однако, как ожидается, это имя папки, за которой следует имя файла kdb без расширения.
После этого изменения ошибка 2538 исчезла. Но теперь я получаю ошибку 2059 с сообщением об ошибке ниже в журнале.
“CipherSpec, согласованный во время установления связи SSL, не соответствует требуемому CipherSpec для канала…”
Мой канал настроен на наличие “TLS_RSA_WITH_AES_256_CBC_SHA256”, как я установил в MQ Explorer. Клиентский код также отправляет одну и ту же спецификацию шифрования. Тем не менее он дает ошибку 2059.
ОБНОВЛЕНИЕ 2: Как было предложено @JoshMc, я установил групповую политику и устранил ошибку выше. Затем я начал получать ошибку “Отсутствует сертификат канала”.
ОБНОВЛЕНИЕ 3: Эта ошибка исчезла после того, как я сменил SSLCAUTH на OPTIONAL. Раньше он был установлен в ТРЕБУЕТСЯ. Спасибо @JoshMc за указание.
Лучший ответ:
Первоначально в вашем вопросе у вас была следующая строка кода:
queueProperties[MQC.SSL_PEER_NAME_PROPERTY] = "ibmwebspheremqtestqueue";
Я посоветовал: SSL_PEER_NAME_PROPERTY
предназначен для проверки части или всего значения DN для сертификата диспетчера очереди, поэтому он будет иметь формат CN=x.domain.com,OU=Y,O=Company Inc
, то, что вы выглядят как ярлык cert.
Вы видите, какие ошибки генерируются, если они есть в менеджерах очереди AMQERR01.LOG? Как насчет локального клиента AMQERR01.LOG?
Вы ответили с ошибкой диспетчера очереди:
AMQ9660: SSL key repository: password stash file absent or unusable.
И вы нашли ошибку за каждое обновление:
UPDATE: Я обнаружил, что ошибка связана с неправильным доступом к базе данных ключей. Я упомянул путь до имени папки, где были размещены сертификаты. Однако, как ожидается, это имя папки, за которой следует имя файла kdb без расширения.
Теперь вы перешли к следующей ошибке:
The CipherSpec negotiated during the SSL handshake does not match the required CipherSpec for channel...
Я посоветовал: Управляемый.net не использует указанный вами шифр, он выбран из политики Windows. Этот вопрос и ответ должны помочь ” IBM MQ.Net CertificateLabel, CipherSpec “.
Вы сообщили, что исправили групповую политику, а затем перешли к следующей ошибке при установке SSLCAUTH(REQUIRED)
на канале SVRCONN
:
channel is lacking a certificate
SSLCAUTH(REQUIRED)
сообщает менеджеру очереди, что вы SSLCAUTH(REQUIRED)
, чтобы клиент имел сертификат. Клиент всегда будет требовать, чтобы диспетчер очереди имел сертификат независимо от того, для чего SSLCAUTH
.
Предполагая, что диспетчер очереди настроен на выполнение CONNAUTH
для проверки пользователя и пароля, которые вы отправляете, и вы установили ADOPTCTX(YES)
в CONNAUTH
AUTHINFO
, тогда наличие SSLCAUTH(OPTIONAL)
является разумной настройкой, так как это означает, что все данные между клиент и диспетчер очереди будут зашифрованы, а соединение будет аутентифицировано id/pw. Даже если у вас есть SSLCAUTH(REQUIRED)
, если вы также настроить SVRCONN
в соответствии с конкретным DN
значение либо через канал SSLPEER
собственности или CHLAUTH TYPE(SSLPEERMAP)
правило SSLPEER
собственности оно не предоставляет какой – либо форме аутентификации.
Я новичок в IBM Websphere MQ
Я пытаюсь добавить сообщения в удаленный администратор очередей websphere MQ. Я получаю следующую ошибку при попытке подключиться к нему.
Кроме того, я пробовал много возможных решений, представленных на форумах, таких как изменение .net framework на 3.5, также я получаю хороший пинг, когда я пингую удаленный компьютер, но я не могу подключиться к нему с помощью кода C #. Прослушиватель диспетчера очередей запущен и работает, но я получаю эту ошибку
2538 — MQRC_HOST_NOT_AVAILABLE
пока пытаешься это сделать.
queueManager = new MQQueueManager();
Я использую .NET framework 4.5. Любая помощь будет оценена.
MQRC_HOST_NOT_AVAILABLE
может означать, что ваш клиент не может найти диспетчер очереди, который вы ему поручили искать. Учитывая, что вы сказали, что ваш код
queueManager = новый MQQueueManager ();
Я подозреваю, что вы не сообщили своему .NET несколько ключевых фрагментов информации, которые ему необходимо знать, чтобы иметь возможность найти диспетчер очереди. Чтобы подключить клиент MQ к диспетчеру очередей, он должен знать
- канал для подключения
- Имя хоста машины, на которой запущен диспетчер очереди
- Порт, на котором работает администратор очередей
Для .NET они могут быть предоставлены разными способами, которые подробно описаны в документации центра знаний по классу MQQueueManager.
На этой странице в примере кода для подключения к диспетчеру очередей говорится:
MQEnvironment.hostname = «fred.mq.com»; // хост для подключения
MQEnvironment.port = -1; // порт для подключения. Если не задан, по умолчанию используется значение 1414 для клиентских подключений WebSphereMQ.
MQEnvironment.channel = «channel.name»; // Чувствительное к регистру имя канала SVRCONN в диспетчере очередей
MQQueueManager qMgr = новый MQQueueManager («MYQM»);
Также обратите внимание, что вызов для создания MQQueueManager также принимает параметр, который является именем подключенного диспетчера очереди.
Убедитесь, что вы предоставляете всю необходимую информацию, которая необходима клиенту для подключения, включая имя администратора очередей. Если он все еще не работает, проверьте журналы диспетчера очереди на наличие сообщений об ошибках (если их нет, клиент действительно не получает доступ к диспетчеру очереди, в противном случае в сообщении об ошибке будет указано, почему диспетчер очереди не отвечает).
Пожалуйста, не используйте класс MQEnvironment, так как он не является потокобезопасным. Гораздо лучше поместить всю информацию в Hashtable и передать Hashtable в класс MQQueueManager. Вот пример управляемого режима MQ .NET с использованием хеш-таблицы для информации о подключении MQ:
using System; using System.Collections; using System.Collections.Generic; using System.Text; using IBM.WMQ; namespace MQTest02 { class MQTest02 { private Hashtable inParms = null; private Hashtable qMgrProp = null; private System.String qManager; private System.String outputQName; /* * The constructor */ public MQTest02() : base() { } /// Make sure the required parameters are present. /// true/false /// private bool allParamsPresent() { bool b = inParms.ContainsKey('-h') && inParms.ContainsKey('-p') && inParms.ContainsKey('-c') && inParms.ContainsKey('-m') && inParms.ContainsKey('-q'); if (b) { try { System.Int32.Parse((System.String)inParms['-p']); } catch (System.FormatException e) { b = false; } } return b; } /// Extract the command-line parameters and initialize the MQ variables. /// /// /// IllegalArgumentException private void init(System.String[] args) { inParms = Hashtable.Synchronized(new Hashtable()); if (args.Length > 0 && (args.Length % 2) == 0) { for (int i = 0; i < args.Length; i += 2) { inParms[args[i]] = args[i + 1]; } } else { throw new System.ArgumentException(); } if (allParamsPresent()) { qManager = ((System.String)inParms['-m']); outputQName = ((System.String)inParms['-q']); qMgrProp = new Hashtable(); qMgrProp.Add(MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES_MANAGED); qMgrProp.Add(MQC.HOST_NAME_PROPERTY, ((System.String)inParms['-h'])); qMgrProp.Add(MQC.CHANNEL_PROPERTY, ((System.String)inParms['-c'])); try { qMgrProp.Add(MQC.PORT_PROPERTY, System.Int32.Parse((System.String)inParms['-p'])); } catch (System.FormatException e) { qMgrProp.Add(MQC.PORT_PROPERTY, 1414); } if (inParms.ContainsKey('-u')) qMgrProp.Add(MQC.USER_ID_PROPERTY, ((System.String)inParms['-u'])); if (inParms.ContainsKey('-x')) qMgrProp.Add(MQC.PASSWORD_PROPERTY, ((System.String)inParms['-x'])); if (inParms.ContainsKey('-s')) qMgrProp.Add(MQC.SECURITY_EXIT_PROPERTY, ((System.String)inParms['-s'])); System.Console.Out.WriteLine('MQTest02:'); Console.WriteLine(' QMgrName ='{0}'', qManager); Console.WriteLine(' Output QName ='{0}'', outputQName); System.Console.Out.WriteLine('QMgr Property values:'); foreach (DictionaryEntry de in qMgrProp) { Console.WriteLine(' {0} = '{1}'', de.Key, de.Value); } } else { throw new System.ArgumentException(); } } /// Connect, open queue, read a message, close queue and disconnect. /// /// /// MQException private void testReceive() { MQQueueManager qMgr = null; MQQueue queue = null; int openOptions = MQC.MQOO_INPUT_AS_Q_DEF + MQC.MQOO_FAIL_IF_QUIESCING; MQGetMessageOptions gmo = new MQGetMessageOptions(); MQMessage receiveMsg = null; try { qMgr = new MQQueueManager(qManager, qMgrProp); System.Console.Out.WriteLine('MQTest02 successfully connected to ' + qManager); queue = qMgr.AccessQueue(outputQName, openOptions, null, null, null); // no alternate user id System.Console.Out.WriteLine('MQTest02 successfully opened ' + outputQName); receiveMsg = new MQMessage(); queue.Get(receiveMsg, gmo); System.Console.Out.WriteLine('Message Data>>>' + receiveMsg.ReadString(receiveMsg.MessageLength)); } catch (MQException mqex) { System.Console.Out.WriteLine('MQTest02 cc=' + mqex.CompletionCode + ' : rc=' + mqex.ReasonCode); } catch (System.IO.IOException ioex) { System.Console.Out.WriteLine('MQTest02 ioex=' + ioex); } finally { try { queue.Close(); System.Console.Out.WriteLine('MQTest02 closed: ' + outputQName); } catch (MQException mqex) { System.Console.Out.WriteLine('MQTest02 cc=' + mqex.CompletionCode + ' : rc=' + mqex.ReasonCode); } try { qMgr.Disconnect(); System.Console.Out.WriteLine('MQTest02 disconnected from ' + qManager); } catch (MQException mqex) { System.Console.Out.WriteLine('MQTest02 cc=' + mqex.CompletionCode + ' : rc=' + mqex.ReasonCode); } } } /// main line /// /// // [STAThread] public static void Main(System.String[] args) { MQTest02 mqt = new MQTest02(); try { mqt.init(args); mqt.testReceive(); } catch (System.ArgumentException e) { System.Console.Out.WriteLine('Usage: MQTest02 -h host -p port -c channel -m QueueManagerName -q QueueName [-u userID] [-x passwd] [-s securityExit]'); System.Environment.Exit(1); } catch (MQException e) { System.Console.Out.WriteLine(e); System.Environment.Exit(1); } System.Environment.Exit(0); } } }
Описание проблемы:
O / S: 7.3, версия MQ: 8.0.0.5. Сервер находится в анклаве.
Существует администратор очередей с каналом подключения к серверу с именем
CL_IR360. Пользователь пытается подключиться к нему, но это не удается
с ошибкой ниже.
Пользователь получает сообщение об ошибке:
- Ошибка тестового подключения
- Соединение с хостом «IP-адрес (порт)» отклонено
- JmqiException CC = 2 RC = 2538 AMQ9213
- Произошла ошибка связи для TCP
- java.net.SocketTimeoutException — время ожидания подключения истекло
- Подключение к IP-адресу (порту) хоста отклонено
- MQxx HOST НЕДОСТУПЕН 2538
Вышеупомянутая ошибка в этом конкретном случае была связана с тем, что для канала подключения к серверу не было установлено прав доступа (SET CHLAUTH). Добавлены права доступа к каналу, и ошибка устранена.
- 1 Вопрос касался .net, а не java. У вас есть вся указанная выше информация, чтобы задать свой вопрос, а затем самому ответить на него, вероятно, это лучшее место для этой информации.
Tweet
Share
Link
Plus
Send
Send
Pin
У меня есть WebSphere MQ и WebSphere Message Broker, установленные в Linux, и когда я выполняю mqsicreateexecutiongroup
Я получаю сообщение об ошибке сказав:
BIP1046E: не удалось подключиться к администратору очередей (не удалось подключиться к администратору очередей «NSPZPAI1» (код причины MQ 2538)).
когда я ищу этот код причины, я понимаю, что это хост недоступен ошибка.
Может кто-нибудь сказать мне, как решить эту ошибку?
когда я запускаю runmqlsr
команда я всегда заканчиваю в зависании. Кто-нибудь подскажет мне, как завести слушателя?
2 ответов
не запускайте прослушиватель вручную или по сценарию. Если у вас есть современный администратор очередей, определите объект прослушивателя следующим образом:
DEF LISTENER(LISTENER.1414) TRPTYPE(TCP) +
CONTROL(QMGR) PORT(1414) +
REPLACE
START LISTENER(LISTENER.1414)
атрибут CONTROL(QMGR)
указывает на «qmgr» для автоматического запуска слушателя, когда на «qmgr» и убить слушателя, когда на «qmgr» закрыли. Это гарантирует, что прослушиватель всегда будет запущен, когда появится QMgr, даже если QMgr запускается вручную, а не из обычного загрузочного скрипта. Потому что слушатель-ребенок процесс на «qmgr» это будет всегда спуститесь с QMgr, поэтому вам не нужно беспокоиться о потерянных слушателях, предотвращающих подключения после перезапуска QMgr.
после того, как слушатель определен, вы также можете использовать START LISTENER
или STOP LISTENER
команды MQSC вручную запустить и остановить его независимо от QMgr. В приведенном выше примере я вручную запустил прослушиватель, а не перезагрузил QMgr. Либо будет работать, но START
команда менее навязчива.
прослушиватель запускается с помощью
runmqlsr -t tcp -p <port> -m <queue manager name>.
он запускает прослушиватель, который ждет соединений. Более подробная информация о команде здесь