【问题标题】:ActiveMQ consumer execution delayActiveMQ 消费者执行延迟
【发布时间】:2011-05-12 17:37:48
【问题描述】:

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

队列的流量相当低,每分钟不到 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);
        }

【问题讨论】:

  • 您是否尝试将日志语句放在 MDB 的顶部以查看它实际上正在获取它?这似乎是一些奇怪的交易错误。
  • 是的,我是,查看更新后的问题

标签: java jboss activemq message-driven-bean


【解决方案1】:

您有多确定消费者会立即将消息从队列中拉出? ActiveMQ 提供了JMSActiveMQBrokerInTimeJMSActiveMQBrokerOutTime 属性,您可以使用它来确认这一点(参见ActiveMQ message properties)。

【讨论】:

  • SimonJ,代理中的总时间几乎完全等于 System.currentTimeMillis() - aMessage.getJMSTimestamp()。这表明经纪人将它们传入/传出的速度很慢。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2012-01-28
    • 1970-01-01
    • 2021-07-29
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-29
    相关资源
    最近更新 更多