Странное явление в 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 2012Java-версия "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), после этого проблема была решена. ты можешь попробовать.
Томз.