Ошибка: Spring Boot для интеграции с IBM Message Queue: 'MQRC_HOST_NOT_AVAILABLE' - PullRequest
1 голос
/ 16 июня 2020

для интеграции с IBM MQ, я использую Spring Boot для создания REST API со службами, которые будут пытаться помещать сообщения в очередь, а также извлекать сообщения из очереди.

Я использую следующие версии:

  • Spring Boot: 2.3.1
  • IBM MQ: 9.1.4.0

У моего приложения SpringBoot есть зависимости: 1. mq- jms-spring-boot-starter (зависимость): 2.0.9 2. spring-boot-starter-web

Я установил IBM MQ, используя рекомендованную установку, и выбрал НЕ настраивать идентификатор пользователя домена для IBM MQ для запуска.

Что касается приложения Spring Boot, я построил его в соответствии со следующим:

com.mi.bootibmmqdemo
   BootIbmMqDemoApplication.java   ----> Spring boot runnable class

com.mi.bootibmmqdemo.controllers.mq
   BootIbmMqDemoController.java    ----> Rest Controller

com.mi.bootibmmqdemo.model.mq
   MqRequestMessage.java    ----> POJO request object
   MqResponseMessage.java   ----> POJO response object

Я сконструировал контроллер REST следующим образом:

package com.mi.bootibmmqdemo.controllers.mq;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.JmsException;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.mi.bootibmmqdemo.model.mq.MqRequestMessage;
import com.mi.bootibmmqdemo.model.mq.MqResponseMessage;

@RestController
@RequestMapping("/boot-ibm-mq")
public class BootIbmMqDemoController {

    Logger logger = LoggerFactory.getLogger(BootIbmMqDemoController.class);

    @Autowired
    JmsTemplate jmsTemplate;

    @PostMapping("/sendMq")
    public MqResponseMessage sendToQueue(@RequestBody MqRequestMessage mqRequestMessage) {

        try {
            jmsTemplate.convertAndSend(mqRequestMessage.getQueueName(), mqRequestMessage.getMessage());
            return new MqResponseMessage("OK");
        } catch (JmsException ex) {
            ex.printStackTrace();
            return new MqResponseMessage("FAIL");
        }
    }

    @GetMapping("/receiveMq")
    String recv(){
        try{
            return jmsTemplate.receive("DEV.QUEUE.1").toString();
        }catch(JmsException ex){
            ex.printStackTrace();
            return "FAIL";
        }
    }
}

Мой файл application.properties содержит следующую конфигурацию:

ibm.mq.queueManager=QM1
ibm.mq.channel=DEV.ADMIN.SVRCONN
ibm.mq.connName=localhost(1414)
ibm.mq.user=admin
ibm.mq.password=passw0rd

Тестирование с помощью почтальона с использованием приведенного ниже запроса JSON:

{
    "queueName":"DEV.QUEUE.1",
    "message":"Hello World!"
}

Я получаю результат «FAIL» , а в журналах появляется следующая ошибка: * 1 027 *

org.springframework.jms.JmsSecurityException: JMSWMQ2013: The security authentication was not valid that was supplied for QueueManager 'QM1' with connection mode 'Client' and host name 'localhost(1414)'.; nested exception is com.ibm.msg.client.jms.DetailedJMSSecurityException: JMSWMQ2013: The security authentication was not valid that was supplied for QueueManager 'QM1' with connection mode 'Client' and host name 'localhost(1414)'.
Please check if the supplied username and password are correct on the QueueManager to which you are connecting.; nested exception is com.ibm.mq.MQException: JMSCMQ0001: IBM MQ call failed with compcode '2' ('MQCC_FAILED') reason '2035' ('MQRC_NOT_AUTHORIZED').
    at org.springframework.jms.support.JmsUtils.convertJmsAccessException(JmsUtils.java:286)
    at org.springframework.jms.support.JmsAccessor.convertJmsAccessException(JmsAccessor.java:185)
    at org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:507)
    at org.springframework.jms.core.JmsTemplate.send(JmsTemplate.java:584)
    at org.springframework.jms.core.JmsTemplate.convertAndSend(JmsTemplate.java:661)
    at com.mi.bootibmmqdemo.controllers.mq.BootIbmMqDemoController.sendToQueue(BootIbmMqDemoController.java:30)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:879)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:748)
Caused by: com.ibm.msg.client.jms.DetailedJMSSecurityException: JMSWMQ2013: The security authentication was not valid that was supplied for QueueManager 'QM1' with connection mode 'Client' and host name 'localhost(1414)'.
Please check if the supplied username and password are correct on the QueueManager to which you are connecting.
    at com.ibm.msg.client.wmq.common.internal.Reason.reasonToException(Reason.java:531)
    at com.ibm.msg.client.wmq.common.internal.Reason.createException(Reason.java:215)
    at com.ibm.msg.client.wmq.internal.WMQConnection.<init>(WMQConnection.java:424)
    at com.ibm.msg.client.wmq.factories.WMQConnectionFactory.createV7ProviderConnection(WMQConnectionFactory.java:8475)
    at com.ibm.msg.client.wmq.factories.WMQConnectionFactory.createProviderConnection(WMQConnectionFactory.java:7815)
    at com.ibm.msg.client.jms.admin.JmsConnectionFactoryImpl._createConnection(JmsConnectionFactoryImpl.java:303)
    at com.ibm.msg.client.jms.admin.JmsConnectionFactoryImpl.createConnection(JmsConnectionFactoryImpl.java:236)
    at com.ibm.mq.jms.MQConnectionFactory.createCommonConnection(MQConnectionFactory.java:6016)
    at com.ibm.mq.jms.MQConnectionFactory.createConnection(MQConnectionFactory.java:6041)
    at org.springframework.jms.support.JmsAccessor.createConnection(JmsAccessor.java:196)
    at org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:494)
    ... 53 more
Caused by: com.ibm.mq.MQException: JMSCMQ0001: IBM MQ call failed with compcode '2' ('MQCC_FAILED') reason '2035' ('MQRC_NOT_AUTHORIZED').
    at com.ibm.msg.client.wmq.common.internal.Reason.createException(Reason.java:203)

При поиске в Интернете потенциальной причины и, начиная с кода ошибки, я обнаружил предложение, указывающее на то, что правило полномочий канала для всего диспетчера очередей необходимо отключить с помощью командной строки (windows ) перейдите в каталог установки MQ, в моем случае это: D: \ IBM \ MQ \ bin

и выполните следующее:

D:\IBM\MQ\bin>runmqsc QM1
5724-H72 (C) Copyright IBM Corp. 1994, 2019.
Starting MQSC for queue manager QM1.


alter qmgr chlauth(disabled)
     1 : alter qmgr chlauth(disabled)
AMQ8005I: IBM MQ queue manager changed.
end
     2 : end
One MQSC command read.
No commands have a syntax error.
All valid MQSC commands were processed.

D:\IBM\MQ\bin>runmqsc QM1
5724-H72 (C) Copyright IBM Corp. 1994, 2019.
Starting MQSC for queue manager QM1.


ALTER QMGR CHLAUTH(DISABLED)
     1 : ALTER QMGR CHLAUTH(DISABLED)
AMQ8005I: IBM MQ queue manager changed.
end
     2 : end
One MQSC command read.
No commands have a syntax error.
All valid MQSC commands were processed.

D:\IBM\MQ\bin>

Я перезапустил диспетчер очередей и перезапустил Приложение Spring Boot и повторное тестирование с почтальоном, та же ошибка повторяется.

ОБНОВЛЕНИЕ: добавление журналов MQ:

6/17/2020 08:17:06 - Process(24384.13) User(MUSR_MQADMIN) Program(amqzlaa0.exe)
                      Host(E107) Installation(Installation1)
                      VRMF(9.1.4.0) QMgr(QM1)
                      Time(2020-06-17T05:17:06.756Z)
                      CommentInsert1(admin)
                      CommentInsert2(BootIbmMqDemoApplication)
                      CommentInsert3(N/A)

AMQ5534E: User ID 'admin' authentication failed

EXPLANATION:
The user ID and password supplied by the 'BootIbmMqDemoApplication' program
could not be authenticated. 
Additional information: 'N/A'.
ACTION:
Ensure that the correct user ID and password are provided by the application.
Ensure that the authentication repository is correctly configured. Look at
previous error messages for any additional information. 
----- amqzfuca.c : 4716 -------------------------------------------------------
6/17/2020 08:17:06 - Process(24384.13) User(MUSR_MQADMIN) Program(amqzlaa0.exe)
                      Host(E107) Installation(Installation1)
                      VRMF(9.1.4.0) QMgr(QM1)
                      Time(2020-06-17T05:17:06.756Z)
                      CommentInsert1(admin)
                      CommentInsert2(DEV.AUTHINFO)
                      CommentInsert3(CHCKCLNT(REQDADM))

AMQ5542I: The failed authentication check was caused by the queue manager
CONNAUTH CHCKCLNT(REQDADM) configuration.

EXPLANATION:
The user ID 'admin' and its password were checked because the queue manager
connection authority (CONNAUTH) configuration refers to an authentication
information (AUTHINFO) object named 'DEV.AUTHINFO' with CHCKCLNT(REQDADM). 

This message accompanies a previous error to clarify the reason for the user ID
and password check.
ACTION:
Refer to the previous error for more information. 

Ensure that a password is specified by the client application and that the
password is correct for the user ID. The authentication configuration of the
queue manager connection determines the user ID repository. For example, the
local operating system user database or an LDAP server. 

If the CHCKCLNT setting is OPTIONAL, the authentication check can be avoided by
not passing a user ID across the channel. For example, by omitting the MQCSP
structure from the client MQCONNX API call. 

To avoid the authentication check, you can amend the authentication
configuration of the queue manager connection, but you should generally not
allow unauthenticated remote access. 
----- amqzfuca.c : 4739 -------------------------------------------------------

С уважением,

...