Spring JMS MQJE001: код завершения '2', причина '2042' - PullRequest
3 голосов
/ 15 февраля 2011

Моя установка - Spring 3 JMS, MVC + Websphere MQ + Websphere 7

<!-- this is the Message Driven POJO (MDP) -->
<bean id="messageListener" class="com.SomeListener" />

<!-- and this is the message listener container -->
<bean id="jmsContainer"
    class="org.springframework.jms.listener.DefaultMessageListenerContainer">
    <property name="connectionFactory" ref="xxxCF" />
    <property name="destination" ref="someQueue" />
    <property name="messageListener" ref="messageListener" />
</bean>

Когда я запускаю сервер, слушатель, кажется, запускается правильно, так как он получает сообщения, которые находятся в очереди, как я их положил.

Однако, как только я запускаю любой простой контроллер / действие, которое даже не имеет ничего общего с JMS, оно снова и снова выдает мне сообщение ...

DefaultMessag W org.springframework.jms.listener.DefaultMessageListenerContainer handleListenerSetupFailure Setup of JMS message listener invoker failed for destination 'queue:///ABCDEF.EFF.OUT?persistence=-1' - trying to recover. Cause: MQJMS2008: failed to open MQ queue ''.; nested exception is com.ibm.mq.MQException: MQJE001: Completion Code '2', Reason '2042'.
DefaultMessag I org.springframework.jms.listener.DefaultMessageListenerContainer refreshConnectionUntilSuccessful Successfully refreshed JMS Connection

ConnectionEve W   J2CA0206W: A connection error occurred.  To help determine the problem, enable the Diagnose Connection Usage option on the Connection Factory or Data Source.

ConnectionEve A   J2CA0056I: The Connection Manager received a fatal connection error from the Resource Adapter for resource JMS$XXXQCF$JMSManagedConnection@2. The exception is: javax.jms.JMSException: MQJMS2008: failed to open MQ queue ''.

ConnectionEve W   J2CA0206W: A connection error occurred.  To help determine the problem, enable the Diagnose Connection Usage option on the Connection Factory or Data Source.

ConnectionEve A   J2CA0056I: The Connection Manager received a fatal connection error from the Resource Adapter for resource jms/XXXQCF. The exception is: javax.jms.JMSException: MQJMS2008: failed to open MQ queue ''.

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

спасибо

1 Ответ

2 голосов
/ 15 февраля 2011

2042 означает «Используемый объект».Поскольку не существует концепции исключительного использования очередей для производителей сообщений, один из ваших потребителей блокирует очередь.

Это поведение контролируется атрибутом DEFSOPT определения очереди .Это в самом администраторе очередей, а не в определениях управляемых объектов или ваших параметрах фабрики.Из командной строки при входе в систему как mqm (или эквивалент платформы, если QMgr находится в Windows, iSeries, z / OS и т. Д.) Вам потребуется запустить runmqsc и выполнить следующие команды, чтобы проверить и затем устранить проблему.В моем примере QMgr - это PLUTO, а примерная очередь - SYSTEM.DEFAULT.LOCAL.QUEUE.

/home/mqm: runmqsc PLUTO
5724-H72 (C) Copyright IBM Corp. 1994, 2009.  ALL RIGHTS RESERVED.
Starting MQSC for queue manager PLUTO.

dis q(system.default.local.queue) defsopt
     1 : dis q(system.default.local.queue) defsopt
AMQ8409: Display Queue details.
   QUEUE(SYSTEM.DEFAULT.LOCAL.QUEUE)       TYPE(QLOCAL)
   DEFSOPT(EXCL)
alter ql(system.default.local.queue) defsopt(shared)
     2 : alter ql(system.default.local.queue) defsopt(shared)
AMQ8008: WebSphere MQ queue changed.
dis q(system.default.local.queue) defsopt
     3 : dis q(system.default.local.queue) defsopt
AMQ8409: Display Queue details.
   QUEUE(SYSTEM.DEFAULT.LOCAL.QUEUE)       TYPE(QLOCAL)
   DEFSOPT(SHARED)

Если вы отобразите очередь и обнаружите, что она уже установлена ​​для DEFSOPT (SHARED), то что-то должноуказать эксклюзивное использование очереди через API.Обычно это означает C или базовую Java-программу, так как эти не-JMS API имеют доступ к низкоуровневой функциональности WMQ.Это может быть немного сложнее для диагностики, и я обычно использую трассировку или выход SupportPac MA0W для отображения вызовов API и используемых опций.Если это так, я бы хотел узнать больше о том, что подразумевается под «простым контроллером / действием», как отмечено в исходном сообщении.

Наконец, если очередь, к которой вы обращаетесь, является удаленной очередьютогда он преобразуется в очередь передачи.Канал всегда будет устанавливать очередь передачи в GET (INHIBITED) и получать эксклюзивную блокировку для него.Это согласуется с функциональностью WMQ, поскольку приложение может получать сообщения только из локальной очереди.

...