MQRC_CLIENT_CONN_ERROR с IBM MQ в докере с использованием CCDT + Spring Boot - PullRequest
0 голосов
/ 22 января 2019

Я использую это официальное руководство IBM: Разработка MQ JMS-приложений с помощью Spring Boot

и использование IBM® MQ Advanced для разработчиков в докере, полученном с этой страницы докера: ibmcom / mq

MQ запускается с этой командой:

docker run --name mq --env LICENSE=accept --env MQ_QMGR_NAME=QM1 --publish 1414:1414 --publish 9443:9443 --detach ibmcom/mq 

Он запущен и работает, и я могу подключиться к нему, используя имя подключения и информацию о канале:

ibm.mq.channel: DEV.ADMIN.SVRCONN
ibm.mq.connectionName: localhost(1414)

Однако я получаю сообщение об ошибке при попытке подключиться к нему с помощью файла CCDT. Я получаю этот файл CCDT с этой командой:

docker cp <container_id>:/mnt/mqm/data/qmgrs/QM1/@ipcc/AMQCLCHL.TAB <path_to_ccdt_path_on_my_computer>

Я установил правильное свойство application.yml:

ibm:
  mq:
    ccdtUrl: file://<path_to_ccdt_path_on_my_computer>

но я получаю эту ошибку:

com.ibm.msg.client.jms.DetailedJMSException: JMSWMQ2020: Failed to connect to queue manager 'QM1' with connection mode 'Client' and supplied CCDT URL 'AMQCLCHL.TAB', see linked exception for more information.
    at com.ibm.msg.client.wmq.common.internal.Reason.reasonToException(Reason.java:595)
    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.listener.AbstractJmsListeningContainer.createSharedConnection(AbstractJmsListeningContainer.java:411)
    at org.springframework.jms.listener.AbstractJmsListeningContainer.establishSharedConnection(AbstractJmsListeningContainer.java:379)
    at org.springframework.jms.listener.DefaultMessageListenerContainer.establishSharedConnection(DefaultMessageListenerContainer.java:818)
    at org.springframework.jms.listener.AbstractJmsListeningContainer.doStart(AbstractJmsListeningContainer.java:291)
    at org.springframework.jms.listener.AbstractJmsListeningContainer.start(AbstractJmsListeningContainer.java:276)
    at org.springframework.jms.listener.DefaultMessageListenerContainer.start(DefaultMessageListenerContainer.java:612)
    at org.springframework.jms.config.JmsListenerEndpointRegistry.startIfNecessary(JmsListenerEndpointRegistry.java:242)
    at org.springframework.jms.config.JmsListenerEndpointRegistry.start(JmsListenerEndpointRegistry.java:205)
    at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:182)
    at org.springframework.context.support.DefaultLifecycleProcessor.access$200(DefaultLifecycleProcessor.java:53)
    at org.springframework.context.support.DefaultLifecycleProcessor$LifecycleGroup.start(DefaultLifecycleProcessor.java:360)
    at org.springframework.context.support.DefaultLifecycleProcessor.startBeans(DefaultLifecycleProcessor.java:158)
    at org.springframework.context.support.DefaultLifecycleProcessor.onRefresh(DefaultLifecycleProcessor.java:122)
    at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:879)
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.finishRefresh(ServletWebServerApplicationContext.java:161)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549)
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:140)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:775)
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:316)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1260)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1248)
    at Application.main(Application.java:11)
Caused by: com.ibm.mq.MQException: JMSCMQ0001: IBM MQ call failed with compcode '2' ('MQCC_FAILED') reason '2278' ('MQRC_CLIENT_CONN_ERROR').
    at com.ibm.msg.client.wmq.common.internal.Reason.createException(Reason.java:203)
    ... 31 common frames omitted
Caused by: com.ibm.mq.jmqi.JmqiException: CC=2;RC=2278
    at com.ibm.mq.jmqi.remote.api.RemoteFAP.jmqiConnect(RemoteFAP.java:1688)
    at com.ibm.mq.jmqi.remote.api.RemoteFAP.jmqiConnect(RemoteFAP.java:1273)
    at com.ibm.mq.ese.jmqi.InterceptedJmqiImpl.jmqiConnect(InterceptedJmqiImpl.java:377)
    at com.ibm.mq.ese.jmqi.ESEJMQI.jmqiConnect(ESEJMQI.java:562)
    at com.ibm.msg.client.wmq.internal.WMQConnection.<init>(WMQConnection.java:357)
    ... 30 common frames omitted

Официальное устранение неполадок здесь: 2278 (08E6) (RC2278): MQRC_CLIENT_CONN_ERROR , но говорит:

"Это также происходит в приложениях Java ™, когда для определения имени канала указана таблица определения канала клиента (CCDT), но сама таблица не может быть найдена."

Однако файл таблицы найден, и если я специально ввел неправильное имя файла, я получаю исключение FileNotFoundException.

Итак, что мне не хватает?

1 Ответ

0 голосов
/ 22 января 2019

* * * * * * * * * * * * * * * * * * * * * 2278 MQRC_CLIENT_CONN_ERROR Как вы обнаружили, потому что приложению не удалось найти канал, соответствующий указанному имени администратора очередей.

Ошибка 2540 MQRC_UNKNOWN_CHANNEL_NAME вызвана тем, что установлено поле QMNAME каналаSYSTEM.DEF.CLNTCONN вы сейчас пытаетесь подключиться к SVRCONN каналу с именем SYSTEM.DEF.CLNTCONN, который не существует.


По умолчанию новый администратор очередей поставляется с таблицей каналов по умолчанию, найденной в следующем расположениив пути MQDATA: qmgrs/<QMGR_NAME>/@ipcc/AMQCLCHL.TAB

Таблица каналов по умолчанию содержит только один канал CLNTCONN с именем SYSTEM.DEF.CLNTCONN.Это предназначено только для отображения значений по умолчанию для вновь определенных CLNTCONN каналов.

В администраторе очередей ваше клиентское приложение подключается к каналу SVRCONN.На стороне клиента соединения, если вы используете CCDT, тип канала, который соединяется с администраторами очередей SVRCONN, равен CLNTCONN.


, так как вы подключаетесь к каналу SVRCONNс именем DEV.ADMIN.SVRCONN вам нужно определить CCDT с CLNTCONN каналом с именем DEV.ADMIN.SVRCONN.

. Я бы рекомендовал не изменять CCDT по умолчанию и вместо этого просто создать новый.


Вы можете использовать следующие шаги для создания CCDT:

echo "DEFINE CHL(DEV.ADMIN.SVRCONN) CHLTYPE(CLNTCONN) QMNAME(QM1) CONNAME(`localhost(1414)`)" | MQCHLLIB=/PATH/TO/CCDT MQCHLTAB=NAME_OF_CCDT runmqsc -n

Просто замените значения MQCHLLIB и MQCHLTAB фактическим путем и именем, которое вы хотите назвать CCDT, например:чтобы создать CCDT с именем AMQCLCHL.TAB в /tmp, используйте следующую команду:

echo "DEFINE CHL(DEV.ADMIN.SVRCONN) CHLTYPE(CLNTCONN) QMNAME(QM1) CONNAME(`localhost(1414)`)" | MQCHLLIB=/tmp MQCHLTAB=AMQCLCHL.TAB runmqsc -n

Еще несколько примеров, показывающих, как создавать CCDT и как MQ выбирает определенный канал в CCDT, вы можетепросмотрите мой ответ на Соединение с IBM MQ с использованием файла CCDT в JMS .

...