2010-11-19 143 views
0

我看到一个问题,其中队列没有备份,但是消费者实际执行JMS消息的时间在创建后100到200秒之间(通过JMSTimestamp-CurrentTime测量)。ActiveMQ消费者执行延迟

流量相对较低,每分钟少于30封邮件。我能够通过重新启动ActiveMQ来解决问题,之后消息从创建时开始少于1ms。

我正在使用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

您是否尝试在MDB的顶部放置一条日志语句以查看它实际上是否正在获取它?这似乎是一些奇怪的交易错误。 – javamonkey79 2010-11-19 17:13:08

+0

是的,我是,看到更新的问题 – Jeremy 2010-11-19 19:08:25

回答

0

事实证明,ActiveMQ表现得很好,我的工作人员花了很长时间,因此备份队列。我的问题中的代码让我看到了这一点。

0

如何某些你的消费是拉动该消息立即关闭队列? ActiveMQ提供您可以用来确认的JMSActiveMQBrokerInTimeJMSActiveMQBrokerOutTime属性(请参阅ActiveMQ message properties)。

+0

谢谢我会给出一个 – Jeremy 2010-11-20 15:49:46

+0

SimonJ,在代理中的总时间几乎完全等于System.currentTimeMillis() - aMessage.getJMSTimestamp()。这向我暗示,这位经纪人进出市场的速度很慢。 – Jeremy 2010-12-02 15:47:50