Задержка потребителей Activemq
-
26-09-2019 - |
Вопрос
Я вижу проблему, в которой очередь не подкреплена, однако время для потребителя фактически выполняет сообщение JMS, составляет от 100 до 200 секунд от создания (как измеряется через jmstimestamp-thicktime).
Поток был довольно низким до очереди, меньше 30 сообщений в минуту. Я смог решить проблему, перезагружая ActiveMQ, после чего сообщения начались меньше, чем за 1 мс от того, когда они были созданы.
Я использую ActiveMQ 5.4.1, и нормальное общее время выполнения для работы в MDB меньше, составляет менее 2 мс. Во время задержки в журнале ActiveMQ не было никаких сообщений об ошибках, CPU был низким и имел много памяти.
Похоже, потребитель вытягивает сообщение с очереди, но сидит на них по какой-то причине.
Есть ли проблема конфигурации, которая может вызвать эту проблему?
Редактировать:
Первая строка моего MDB выглядит следующим образом:
/* Check the time since this message was created versus processed */
try {
long secondsToProcess = TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis() - aMessage.getJMSTimestamp());
if (secondsToProcess > 5) {
log.error("JMS Consumer Start Delay: " + secondsToProcess + " s" + " JMS Message took more then 5 seconds to be processed");
} else {
log.debug("JMS Consumer Start Delay: " + secondsToProcess + " s");
}
} catch (Exception e) {
log.error(e);
}
Решение 2
Как оказывается, ActiveMQ вела себя хорошо в порядке, мои рабочие взяли слишком долго, отсюдат резервировать очередь. Код в моем вопросе позволил мне увидеть это.
Другие советы
Насколько вы уверены, что потребитель немедленно вытягивает сообщение с очереди? Activemq предоставляет JMSActiveMQBrokerInTime
и JMSActiveMQBrokerOutTime
свойства, которые вы можете использовать для подтверждения этого (см. Свойства сообщения ActiveMQ).