我发现没有备份队列的问题,但是消费者实际执行JMS消息的时间是从创建起100到200秒之间(通过JMSTimestamp-CurrentTime测量)。
队列中的流量相当低,每分钟少于30条消息。我能够通过重新启动ActiveMQ来解决问题,之后在创建消息的时间不到1毫秒就开始了消息。
我正在使用ActiveMQ 5.4.1,并且在MDB中完成的工作的正常总执行时间小于2ms。在延迟时,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);
}
答案 0 :(得分:0)
消费者如何立即将消息从队列中拉出来? ActiveMQ提供了可用于确认此情况的JMSActiveMQBrokerInTime
和JMSActiveMQBrokerOutTime
属性(请参阅ActiveMQ message properties)。
答案 1 :(得分:0)
事实证明,ActiveMQ表现得很好,我的工作人员花了太长时间,因此备份了队列。我的问题中的代码让我看到了。