Странное явление в Open MQ: неожиданно сообщения начинают на некоторое время зависать в очереди JMS, прежде чем доставлять их в MDB

Краткий обзор приложения

Приложение JEE выполняется на сервере GlassFish, см. Подробности о системной среде ниже и использует встроенный Open MQ, настроенный во встроенном режиме в GlassFish для внутренней передачи сообщений JMS. В качестве получателя сообщения используется Message Driven Bean. Размер пула MDB является значением по умолчанию 32, см. Конфигурацию JMS и сведения о классе MDB ниже.

Приложение может быть разделено на две основные части и функционирует примерно следующим образом:

  • внешний системный адаптер прослушивает устаревшие сообщения от различных внешних систем и отправляет их в виде сообщений JMS в основное приложение.
  • основное приложение обрабатывает полученные сообщения JMS. MDB работает здесь.

Описание проблемы

Доставка сообщений от адаптера к ядру обычно проходит без сбоев и занимает всего пару секунд. Однако из-за неизвестной причины иногда возникает следующая ситуация: сообщение, отправленное адаптером, застревает в очереди JMS на минуту и ​​только после этого передается в MDB. Использование команд мониторинга Open MQ: imqcmd metrics dst -t q -n CacheQueueDest или же imqcmd query dst -t q -n CacheQueueDest мы видим, что отправленное сообщение находится в очереди, и только через минуту вызывается метод onMessage MDB. Когда возникает эта неисправная ситуация, даже одно сообщение застревает в очереди, поэтому проблема будет существовать независимо от загрузки системы.

Я установил уровень журнала DEBUGHIGH для Open MQ, но ничего не нашел в журнале. Я настроил Open MQ как локальный (работающий в собственном процессе, а не внутри процесса GlassFish) и установил ведение журнала на уровне пакетов, но также ничего не нашел.

Единственный способ избавиться от этого неисправного состояния - перезапустить сервер GlassFish.

Буду признателен за любые идеи, чтобы решить эту проблему.

Системная среда:

  • SunOS 5.10 Generic_150401-05 i86pc i386 i86pc

  • GlassFish Server Open Source Edition 3.1.2.2 (сборка 5)

  • Открыть очередь сообщений 4.5.2
    оракул
    Версия: 4.5.2 Патч 1 (Сборка 3-й)
    Компиляция: четверг, 7 июня, 10:46:15 PDT 2012

  • Java-версия "1.7.0_25"
    Java (TM) SE Runtime Environment (сборка 1.7.0_25-b34)
    Java HotSpot (TM) 64-битная серверная виртуальная машина (сборка 23.25-b03, смешанный режим)

Конфигурация JMS из домена.xml:

<resources>
    <admin-object-resource 
     res-adapter="jmsra"
     res-type="javax.jms.Queue"
     jndi-name="jms/cacheQueue">
        <property name="Name" value="CacheQueueDest"></property>
    </admin-object-resource>

    <connector-connection-pool 
         name="jms/cacheConnFactory" 
         resource-adapter-name="jmsra" 
         is-connection-validation-required="true"
         connection-definition-name="javax.jms.QueueConnectionFactory"
         max-wait-time-in-millis="6000"
         fail-all-connections="true"
         transaction-support="NoTransaction"/>
</resources>

<configs>
    <config name="server-config">

        <mdb-container/>

        <jms-service default-jms-host="default_JMS_host">
            <jms-host port="59900" host="localhost" name="default_JMS_host"></jms-host>
        </jms-service>
    </config>
</configs>

Класс MDB:

...
import javax.jms.Message;
import javax.jms.MessageListener;
...
@MessageDriven(mappedName = "jms/cacheQueue", messageListenerInterface = javax.jms.MessageListener.class)
public class CacheChange implements MessageListener {
    ...
    @TransactionAttribute(value = TransactionAttributeType.NOT_SUPPORTED)
    @Override
    public void onMessage(final Message message) {
        ...
    }
    ...
}

1 ответ

Я нашел эту проблему когда-то в режиме встраивания. Мы переключаемся в локальный автономный режим (запускаем отдельную JVM OpenMQ), после этого проблема была решена. ты можешь попробовать.

Томз.

Другие вопросы по тегам