IBM MQ 8.0, Как указать имя пользователя и пароль для amqsget в качестве параметров командной строки
В MQ 8.0 представлена новая функция, которая требует от администраторов MQ использования удаленного доступа предоставления идентификатора пользователя и пароля. Если идентификатор пользователя и пароль не указаны или пароль неверный
Ошибка: 2035 Код: 2 Администратор очередей настроен на запрос идентификатора пользователя и пароля, но они не были предоставлены.
Проблема лучше описана по этой ссылке. Обсуждаются три сценария. Мое решение попало бы в сценарий A) Образцы MQ: укажите пользователя и пароль для клиентского приложения MQ.
Я пытаюсь читать из MQ с помощью программы. Есть ли способ передать имя пользователя и пароль как часть параметров командной строки, а не вводить их при появлении запроса. Потому что этот exe вызывается моей программой.
$ amqsputc qName qMgr
Ganesh Kumar 26 Фев 2016 в 10:02
Если вы хотите изменить образец приложения, измените образец, чтобы он принимал идентификатор пользователя и пароль также из командной строки: Пример: amqsputc qName qMgr userId password.
Messaging MOM – IBM (WebSphere) MQ
We are big fans of messaging at DeeperThanBlue. It’s used everywhere in mobile applications to store and forward data between handheld devices and host applications, as well as between trading partners to securely transmit information such as orders, customer data or information about products between parties. There are many other examples which include being the messaging and information backbone between business systems on corporate networks.
What is IBM MQ?
IBM® MQ (formerly known as WebSphere MQ and MQSeries) is robust messaging middleware that simplifies and accelerates the integration of different applications and business data across multiple platforms on-premise and in the cloud. It supports a wide range of APIs and programming languages. IBM MQ facilitates the assured, secure and reliable exchange of information between applications, systems, services and file by sending and receiving message data via messaging queues, thereby simplifying the creation and maintenance of business applications. It delivers Universal Messaging with a broad set of offerings to meet enterprise-wide messaging needs, as well as providing connectivity for mobile devices MQTT and the ever-growing use case of IoT – Internet of Things computing.
Where is Messaging Used?
- requesting a balance or withdrawing money at a Cash Point/ ATM
- using an E-commerce site to order your groceries, cinema tickets, or buy the latest gadget
- the tracking of goods in Logistics that are being delivered
- where an Insurance Quote is being requested either on-line, over the phone or in a branch
- meter readings for Utility Supplies such as Water, Gas, and Electric that are automated and provide more accurate bills and feedback to the customer on consumption
- Stock Market trades and share price updates that operate at a high velocity and volume
- Travel availability and reservation for hotels, flights and trains.
IBM MQ Capabilities
IBM MQ simplifies connectivity by removing the requirement for application changes to help ensure security and once only delivery of transaction-based messages.
- Once and once only delivery: With IBM MQ, data arrives once, unlike other solutions that can duplicate or lose messages because they have a different quality of service
- Transactional: IBM MQ handles all messages using a transaction, so you can be assured of predictable behaviour even in failure situations
- Asynchronous: If the network or an application becomes unavailable, synchronous solutions will fail. Asynchronous solutions, such as IBM MQ, protect that data and resume its transport when the system becomes available again
- Message encryption: Various solutions offer protection for data at rest. Some only protect the disk, but whereas IBM MQ Advanced protects the message data itself. If the disk is hacked and only the disk is encrypted, everything on that disk is vulnerable. Protection of the messages themselves gives extra peace of mind
IBM MQ is a universal messaging solution. You can run it on premises using software, on an optimised appliance, on a mainframe, or in one cloud or a multi-cloud environment.
From time to time IBM introduces new releases/ versions of IBM MQ and withdraws older versions through announcing end of support dates. More information on these can be found on our IBM MQ End of Support page.
Some of our latest work with IBM MQ
Case Study
Symphony Group – Improving Order to Cash
Symphony Group is the UK’s largest privately owned manufacturer of fitted kitchen, fitted bedroom and fitted bathroom furniture. We undertook a bespoke mobile application development to improve consignment visibility from production line through to customer delivery. This includes picking and packing in the warehouse. The solution provides proof of delivery and improves invoicing accuracy and cash flow. IBM MQ is the backbone to this application providing the message delivery between handheld devices and line of business applications running on Oracle.
Case Study
Ryder Trucks – Connecting Trading Partners
As one of the UK’s leading commercial vehicle rental, contract hire, and dedicated delivery solutions they are reliant on robust business systems to manage their fleet. We helped them with their WebSphere MQ implementation, on-boarding of partners and continue to provide WebSphereMQ support to the environments which underpin their electronic booking systems for trading partner management.
WebSphere MQ для начинающих
В рамках одной из задач было необходимо интегрироваться с внешней системой. В проме и у всех разработчиков стоит IBM WebSphere поэтому WebSphere MQ отлично вписывался, учитывая также то, что с IBM WebSphere у них отличная интеграция «из коробки». Для начала установим и настроим WebSphere и WebSphere MQ, после напишем простое приложение для отправки и приема данных из очереди и завершим все установкой и настройкой HermesJMS и посмотрим как отправлять и просматривать сообщения из нее. Все будет производится в Windows 7. Перед тем как продолжать скачайте выше перечисленные программы.
Установка и настройка WebSphere и WebSphere MQ
Надеюсь Вы уже скачали все необходимые программы и готовы приступить к установке. Первым делом запустите установщик IBM Installation Manager. Дабы не увеличивать размер статьи скриншоты, которые не имеют особой смысловой нагрузки, буду убирать в спойлеры, т.к. полностью удалить из статьи считаю неправильно т.к. они дают понимание что Вы делаете все правильно.
Скриншоты




Перезапускаем Instalation Manager и идем в пункт Файл -> Параметры. Добавляем хранилище из первого диска.

Нажимаем ОК и начинаем установку.
Скриншоты с описанием




Убираем флажок с русского перевода.


Далее установщик попросит вставить диски 2 и 3. Вставляем их.

После установки автоматически запустится менеджер профилей.

Нажимаем кнопку «Create. » и далее делаем как на скриншотах ниже.
Скриншоты




Теперь установим WebSphere MQ.
Скриншоты








После того как установка завершена давайте настроим WebSphere MQ и WebSphere. Начнем с WebSphere MQ так как нам понадобятся имена очередей и менеджер очередей при настройке WebSphere. Все команды исполняются из директории bin каталога WebSphere MQ. Первым делом создадим менеджер очередей и назовем его HABR_QUEUE_MANAGER, используя команду crtmqm.exe HABR_QUEUE_MANAGER.

Запустим наш только что созданный менеджер очередей с помощью команды strmqm.exe HABR_QUEUE_MANAGER.

- DEFINE QLOCAL(HOME.TO.ES) — очередь для отправки сообщений из нашего приложения во внешнюю систему
- DEFINE QLOCAL(ES.TO.HOME) — очередь для приема сообщений из внешней системы
- DEFINE LISTENER(HABR_QUEUE_MANAGER.LISTENER) TRPTYPE (TCP) PORT(1414)
- START LISTENER(HABR_QUEUE_MANAGER.LISTENER)
- DEFINE CHANNEL(SYSTEM.ADMIN.SVRCONN) CHLTYPE(SVRCONN)

Приступим к настройке WebSphere Application Server.
Создадим Connection factory. Для этого запустим консоль администратора и выберем пункт Resources->JMS providers->WebSphere MQ messaging provider->Queue connection factories->New (Как показано на скриншоте ниже).
Далее вводим имя и jndi имя.


Вписываем имя queue manager-а.


Если при проверке соединения возникает сообщение(которое показано на скриншоте ниже), то произведите следующие действия.
- Снова запустите командную строку MQ и выполните runmqsc.exe HABR_QUEUE_MANAGER
- Наберите ALTER QMGR CHLAUTH(DISABLED)
- Перейдите в раздел службы в Windows и у службы IBM MQSeries в разделе «Вход в систему» замените на свою учетную запись. Тоже самое проделайте для службы WebSphere Application Server 8.5
- Перезагрузите систему и запустите HABR_QUEUE_MANAGER и стартаните LISTENER(HABR_QUEUE_MANAGER.LISTENER)
- Теперь все должно заработать

Теперь создаем очереди. Нам нужно создать 2 очереди. Названия у них будут как и у очередей, созданных в WebSphere MQ. Если кто забыл то они называются ES.TO.HOME и HOME.TO.ES. Идем в пункт Resources->JMS->Queues->New


Вторую создаем по аналогии.

Осталось настроить Listener port. Заходим в Application servers -> server1 -> Message listener service -> Listener ports и добавляем новый.

Сохраняем конфигурацию. Мы указали jndi имя queue connection manager-а и jndi имя очереди, в которую будут приходить сообщения из внешней системы. Запустите порт.
Теперь у нас есть настроенные WebSphere Application Server и WebSphere MQ. Можно приступать к созданию простого тестового приложения.
Создание простого приложения для отправки и приема сообщений из очереди
Я умышленно при разработке приложения не буду использовать различные средства для сборки проектов таких как Maven, Gradle или ant, чтобы вы могли понять что вообще происходит за кулисами. Но все же для удобства напишу пару скриптов, с помощью которых будет производится сборка проекта в ear. Весь проект я выложил на github. Ниже я опишу только основные моменты.
Отправка сообщения в очередь
Чтобы отправить сообщение создадим сервлет, бин и форму для ввода сообщения.
Начнем с класса JMSMessageBean из модуля ejb-core. В методе ejbCreate мы получаем ссылки на Connection factory и очередь, в которую будем отправлять сообщения. Метод processMessage предназначен для создания текстового сообщения и отправки его в очередь.
public class JMSMessageBean implements SessionBean < private SessionContext sessionContext; private QueueConnectionFactory connectionFactory; private Queue destination; public boolean processMessage(String message) < QueueConnection jmsConnection = null; QueueSession jmsSession = null; try < jmsConnection = connectionFactory.createQueueConnection(); jmsSession = jmsConnection.createQueueSession(true, Session.AUTO_ACKNOWLEDGE); TextMessage jmsMessage = jmsSession.createTextMessage(); jmsMessage.setText(message); jmsSession.createSender(destination).send(jmsMessage); >catch (JMSException e) < return false; >finally < try < if (jmsSession != null) < jmsSession.close(); >if (jmsConnection != null) < jmsConnection.close(); >> catch (JMSException e) < e.printStackTrace(); >> return true; > public void ejbCreate() throws EJBException < try < Context ctx = new InitialContext(); connectionFactory = (QueueConnectionFactory) ctx.lookup("java:comp/env/QMHabr"); destination = (Queue) ctx.lookup("java:comp/env/jms/HOME.TO.ES"); >catch (NamingException e) < throw new EJBException(e); >> @Override public void ejbActivate() throws EJBException < >@Override public void ejbPassivate() throws EJBException < >@Override public void ejbRemove() throws EJBException < >@Override public void setSessionContext(SessionContext sessionContext) throws EJBException < this.sessionContext = sessionContext; >>
Ниже показан наш сервлет SendJMSMessageServlet. В методе init получаем ссылку на бин, который описан выше. Далее в методе doPost он принимает сообщение от формы и направляет методу processMessage бина. Всю остальную работу выполняет бин.
public class SendJMSMessageServlet extends HttpServlet < private static final String MESSAGE_PARAMETER_NAME = "message"; private static final String MESSAGE_SENDING_SUCCESS = "Сообщение успешно отправлено"; private static final String MESSAGE_SENDING_ERROR = "Сообщение отправлено с ошибкой"; private JMSMessage jmsMessage = null; @Override public void init() throws ServletException < super.init(); try < Context ctx = new InitialContext(); Object objHome = ctx.lookup("java:comp/env/ejb/JMSMessageLocal"); JMSMessageHome jmsMessageHome = (JMSMessageHome) PortableRemoteObject.narrow(objHome, JMSMessageHome.class); jmsMessage = jmsMessageHome.create(); >catch (Exception e) < throw new ServletException(e); >> @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException < request.getRequestDispatcher("/sendMessage.jsp").forward(request, response); >@Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException < request.setCharacterEncoding("UTF-8"); String message = request.getParameter(MESSAGE_PARAMETER_NAME); request.setAttribute(MESSAGE_PARAMETER_NAME, (jmsMessage.processMessage(message)) ? MESSAGE_SENDING_SUCCESS : MESSAGE_SENDING_ERROR); request.getRequestDispatcher("/viewMessage.jsp").forward(request, response); >>
Html форма отправки самая элементарная. Это не самая важная часть. Сообщение можно было захардкодить или получать из properties файла. Но код все равно приведу.
Отправка сообщения в очередь
Установка и настройка HermesJMS
Если WebSphere MQ установлена на другой машине и Вам надоело бегать проверять сообщения в очереди или просто хотите иметь удобное средство для отправки тестовых сообщений в очередь, то можно использовать HermesJMS. Возможно есть аналоги, но те, которые я находил, были платные. Посоветуйте в комментариях хорошие бесплатные аналоги если знаете. С удовольствием рассмотрю другие подобные системы. Конкретно в HermesJMS не совсем устраивают некоторые UI баги и не освобождаются ресурсы если отправлять сообщение из файла (лочит намертво), но жить с ними можно.
И так, приступим к установке и настройке.
Скриншоты





Запустите HermesJMS и добавьте новую сессию. Для начала перейдите во вкладку Providers и добавьте новую группу. Назовите ее как на скриншоте(хотя это не важно) и добавьте все jar файлы, перечисленные ниже.

После добавления провайдера в пункте Session выберите его из выпадающего списка. Пример настройки других полей показан на скриншоте ниже.

Теперь попробуем отправить сообщение в нашу очередь. Для это заходим по адресу http://localhost:9080/habr/sendMessage и вводим любое сообщение в поле ввода и нажимаем кнопку «Отправить».

Теперь откройте HermesJMS и откройте очередь HOME.TO.ES на просмотр. Если Вы увидели сообщение как показано ниже на скриншоте, то все произведенные выше действия Вы выполнили верно.

На этом я статью завершаю. Всем спасибо за внимание! Надеюсь она будет кому-то полезна.
How to specify userid and password when connecting to IBM MQ?
IBM MQ v8+ added the Connection Authentication (CONNAUTH) feature to allow checking of user’s password when connecting to IBM MQ.
IBM MQ / 9.3
Connection Authentication: Configuration
Answer
The MQCSP (IBM MQ connection security parameters) structure enables passing specific user ID and password when connecting to IBM MQ. The MQCSP structure was introduced into WebSphere IBM MQ V6. MQCSP allows long (> 12 chars) userid and passwords for user authentication. This will be checked/authentication when CONNAUTH configuration is configured to check the password, ie: CHCKLOCL, CHCKCLNT of OPTIONAL, REQUIRED, REQDADM.
- If NOT using MQCSP, there is a limit on number of characters for the userid and password (12-characters for Unix/Linux). Ensure you use MQCSP to handle longer passwords.
The following provides examples and information on how to pass a userid and password in difference cases and how to ensure you use MQCSP.
For runmqsc:
To specify userid/password for runmqsc, you must use the ‘-u [userid]’ option.
Note: If you have configured the CONNAUTH AUTHINFO record with CHCKLOCL(REQUIRED) or CHCKLOCL(REQDADM), you must use the -u parameter otherwise you will not be able to administer your queue manager with runmqsc.
For some MQ sample programs (amqsputc,amqsgetc,amqsbcg,etc.):
Several IBM MQ Sample programs utilize environment variable named MQSAMP_USER_ID which should be set to the user ID to be used for connection authentication.
When this is set, the program will prompt for a password to accompany that user ID.
Example Windows:
set MQSAMP_USER_ID=user123
amqsputc
Example Unix/Linux:
export MQSAMP_USER_ID=user123
amqsputc
Connection authentication with the Java/JMS client:
- In IBM MQ classes for Java, set the property MQConstants.USE_MQCSP_AUTHENTICATION_PROPERTY to true in the properties hashtable that is passed to the com.ibm.mq.MQQueueManager constructor.
- In IBM MQ classes for JMS, set the property JmsConstants.USER_AUTHENTICATION_MQCSP to true, on the appropriate connection factory before creating the connection.
- Globally, set the JVM system property com.ibm.mq.cfg.jmqi.useMQCSPauthentication to a value indicating true, for example, by adding -Dcom.ibm.mq.cfg.jmqi.useMQCSPauthentication=Y to the command line.
Old (pre IBM MQv8) Java client only sends userid and password in the MQCD, which has 12-character limit. Ensure you are using a later IBM MQ Java client and ensure you enable MQCSP per above.
From IBM MQ 9.2.1, if a user ID and password are specified, MQCSP authentication is used by default.
In versions earlier than IBM MQ 9.2.1, if a user ID and password are specified, the default mode is as follows:
- MQCSP authentication is used by default by applications that use IBM MQ classes for Java.
- Compatibility mode is used by default by applications that use IBM MQ classes for JMS.
How to specify a userid and a password in MQ Explorer:
See Chapter 3 for using the MQCSP structure:
(do NOT enable the checkbox for «User identification compatibility mode»)
These are the chapters:
Chapter 1: Setup of a connection for a remote queue manager
Chapter 2: Specifying userid and password using the default compatibility mode («User identification compatibility mode» — checkbox enabled by default)
Chapter 3: Specifying userid and password using MQCSP Authentication mode (NOT using «»User identification compatibility mode» — need to disable the checkbox)
User identification for MQ Explorer
Using userid and password from WebSphere Application Server to Websphere MQ via a J2C authentication alias:
Enterprise applications, the WebSphere Application Server WebSphere MQ messaging provider connection factories and Authentication Aliases explained
Old applications which did not provide userid and password:
The suggestion would be to update the applications to provide userid and password (see below.)
If your application cannot be modified, possibly a security exit can be utilized or created.
IBM provides a client-side channel security exit called mqccred which can possibly be used.
There is also a link to step-by-step example of using mqccred, see:
To modify/develop applications to enable passing userid and password:
Application examples for connection authentication:
MQI/c program:
For an application using MQI to connect to queue manager, MQCONNX call and MQCSP structure should be used. Sample C fragment code for connection authentication
char *QMName = «queue_manager»;
char *Userid = «user_id»;
char *Password = «password»;
MQCNO cno = ;
MQCSP csp = ;
cno.SecurityParmsPtr = &csp;
cno.Version = MQCNO_VERSION_5;
csp.AuthenticationType = MQCSP_AUTH_USER_ID_AND_PWD;
csp.CSPuser IDPtr = Userid;
csp.CSPuser IDLength = strlen(Userid);
csp.CSPPasswordPtr = Password;
csp.CSPPasswordLength = strlen(csp.CSPPasswordPtr);
MQCONNX(QMName, &cno, &Hcon, &CompCode, &CReason);
Object-oriented languages:
Such as the Java classes, properties are set before connecting to the queue manager. Java code fragment for connection authentication
String QMName = «queue_manager»;
String Userid = «user_id»;
String Password = «password»;
Hashtable h = new Hashtable();
h.put(MQConstants.USER_ID_PROPERTY, Userid);
h.put(MQConstants.PASSWORD_PROPERTY, Password);
h.put(MQConstants.USE_MQCSP_AUTHENTICATION_PROPERTY, true);
MQQueueManager qMgr = new MQQueueManager(QMName,h)
Or the MQEnvironment property class can also be used
String QMName = «queue_manager»;
String Userid = «user_id»;
String Password = «password»;
MQEnvironment.properties = new Hashtable();
MQEnvironment.userID = Userid;
MQEnvironment.password =Password;
MQQueueManager qMgr = new MQQueueManager(QMName);
JMS & XMS: Connection methods take/pass user id and password parameters
connectionFactory.createConnection(Userid,Password)
if using Connection factory:
Connection connection = null;
try // Create a connection factory
JmsFactoryFactory ff = JmsFactoryFactory.getInstance(WMQConstants.WMQ_PROVIDER);
JmsConnectionFactory cf = ff.createConnectionFactory();
// Set the properties
cf.setStringProperty(WMQConstants.WMQ_HOST_NAME, «localhost»);
cf.setIntProperty(WMQConstants.WMQ_PORT, 1414);
cf.setStringProperty(WMQConstants.WMQ_CHANNEL, «MYCHANNEL»);
cf.setIntProperty(WMQConstants.WMQ_CONNECTION_MODE, WMQConstants.WMQ_CM_CLIENT);
cf.setStringProperty(WMQConstants.WMQ_QUEUE_MANAGER, «QM1»);
cf.setStringProperty(WMQConstants.USERID, «user123»);
cf.setStringProperty(WMQConstants.PASSWORD, «passw0rd»);
cf.setBooleanProperty(WMQConstants.USER_AUTHENTICATION_MQCSP, true);
// Make the connection
connection = cf.createConnection();
>
catch (JMSException jmsex) System.out.println(jmsex);
>