Задержка выполнения потребителем ActiveMQ - PullRequest
0 голосов
/ 19 ноября 2010

Я вижу проблему, когда очередь не резервируется, однако время для фактического выполнения потребителем сообщения JMS составляет от 100 до 200 секунд с момента создания (как измерено с помощью JMSTimestamp-CurrentTime).

Поток в очередь был довольно низким, менее 30 сообщений в минуту. Мне удалось решить проблему, перезапустив ActiveMQ, после чего сообщения запускались менее чем через 1 мс с момента их создания.

Я использую ActiveMQ 5.4.1, и обычное общее время выполнения для работы, выполняемой в MDB, составляет менее 2 мс. На момент задержки в журнале ActiveMQ не было сообщений об ошибках, ЦП был низким и имел много памяти.

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

Есть ли какие-либо проблемы с конфигурацией, которые могут быть причиной этой проблемы?

Edit:

Первая строка моего 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 ]

0 голосов
/ 09 января 2012

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

0 голосов
/ 20 ноября 2010

Насколько вы уверены, что потребитель немедленно вытаскивает сообщение из очереди? ActiveMQ предоставляет свойства JMSActiveMQBrokerInTime и JMSActiveMQBrokerOutTime, которые можно использовать для подтверждения этого (см. Свойства сообщения ActiveMQ ).

...