2016-12-28 5 views
2

При попытке отправить сообщение JMS к внешней очереди Он неисправного с ниже ошибки декларацииMQRC_UNKNOWN_ALIAS_BASE_Q при использовании пружины JmsTemplate отправить сообщение

error occured while sending the message :JMSWMQ2008: Failed to open MQ queue 'TESTQUEUE'.; nested exception is com.ibm.mq.MQException: JMSCMQ0001: WebSphere MQ call failed with compcode '2' ('MQCC_FAILED') reason '2082' ('MQRC_UNKNOWN_ALIAS_BASE_Q'). 

Jms Шаблон

<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"> 
     <property name="connectionFactory" ref="cachedJmsQueueConnectionFactory" /> 
     <property name="pubSubDomain" value="false" /> 
     <property name="receiveTimeout" value="2000" /> 
    </bean> 

<bean id="testQueue" class="com.ibm.mq.jms.MQQueue"> 
     <property name="baseQueueManagerName" value="${test.qmgrName}" /> 
     <property name="baseQueueName" value="${test.queue}" /> 
    </bean> 

this.jmsTemplate.convertAndSend(getDestinationBean("testQueue"), 
         message.getJson()); 

, но если я используйте динамический целеуказатель с jmsTemplate, я мог бы отправить сообщение

this.jmsTemplate.convertAndSend ("TESTQUEUE", message.getJson());

ответ

3

В этой ситуации, когда работает одна программа, и нет разницы в том, что обе программы разрешили разные имена очередей. Чтобы понять, что неправильно, нужно понимать, как имена решаются. Есть два варианта, для которых 2082: MQRC_UNKNOWN_ALIAS_BASE_Q результатов:

  1. TARGQ точки атрибута Очереди псевдонима, чтобы несуществующая очередь.
  2. Очередь псевдонимов относится к нелокальной кластерной очереди.

В первом случае очередь с псевдонимом определена в локальной очереди, но определение каким-то образом является дефектным. Часто это происходит потому, что имя локальной очереди написано неправильно. В результате TARGQ ничего локального не может решить. Это достаточно легко диагностировать путем простой проверки или с помощью amqsput или любого другого образца, который помещает сообщение в очередь.

Единственный способ, которым это может работать в одном экземпляре, а не в другом, как описано, заключается в том, что одно приложение разрешает очередь псевдонимов, а другая нет. Например, одно из двух приложений указывает нелокальное имя QMgr, и сообщение помещается непосредственно в очередь передачи, тогда как другое - в тупик, разрешая сломанный псевдоним.

Второй случай - когда псевдоним разрешается в нелокальной кластерной очереди, но вызывающая программа указала локальное имя QMgr как часть адресата. Ключом к пониманию этого случая является то, что в отличие от QRemote, который может повторно отображать имя QMgr, QAlias ​​не изменяет имя QMgr, указанное вызывающим приложением. Поскольку имя QMgr не должно предоставляться для переустановки кластеризованной очереди, предоставление непустой строки здесь нарушает разрешение.

Вот почему ... При открытии кластерной очереди приложение не указывает имя QMgr, а MQ решает, к какому экземпляру отправить. Механизм разрешения имен сначала выглядит локально, и если он находит кластерную очередь, он использует атрибут CLWLUSEQ, чтобы решить, следует ли предпочитать локальный экземпляр над кластерными экземплярами. Но если то, что он находит, является псевдонимом по кластерной очереди, он решает диски с использованием имени TARGQ. Если локальное имя QMgr указано как часть полностью назначенного адреса назначения, и нет экземпляра локальной очереди, который соответствует TARGQ, в этом случае нет способа разрешить его, и разрешение не удастся. Для успешного использования псевдонимов в кластерной очереди поэтому для вызывающей программы требуется , а не указать имя QMgr.

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

Лучшее, что нужно сделать, это использовать хорошо известный код, для которого разрешение однозначно. Образец amqsput хорош, но то, что вам действительно нужно проверить, это программа, которая позволяет указать как имя QMgr для подключения, так и имя QMgr для адреса назначения, например программу Q от SupportPac MA01. Повторно создайте ошибку, указав локальное имя QMgr в получателе или оставив ее пустой, и вы сможете распознать случай, в котором она терпит неудачу, а затем соответствующим образом изменить код.

0

Как упоминалось Робом, если это кластерная очередь, то не указывать диспетчер очереди.

<bean id="testInQueue" class="com.ibm.mq.jms.MQQueue"> 
    <property name="baseQueueName" value="${test.queue}" /> 
</bean> 

Эта конфигурация работала для меня.

 Смежные вопросы

  • Нет связанных вопросов^_^