【问题标题】:Are Topic message dequeued after they are consumed by topic subscriber?(AMQ 5.3.1)主题消息被主题订阅者消费后是否出列?(AMQ 5.3.1)
【发布时间】:2011-11-21 17:41:06
【问题描述】:

我有 jms 主题,可能有 0,1,2 个订阅者(这意味着一些订阅者可能已关闭或停止)。 我有生产者不断向主题发送消息,我可以看到消息在主题中排队,我看到有订阅者,我看到我的消费者正在接收消息。但是从activemq web admin接口我看到没有消息出队。此外,从 heapdump 我看到,当时传递主题中的消息正在增加,但消费者消耗它们的速度较慢,而生产者发送它们的速度更快。所以过了一段时间我得到了内存不足的异常。

我的问题是,如果消息没有出队,这是否意味着它们在主题中并且由于它们的计数增加而内存在增加?我该如何解决这个问题?

来自 activemq 管理接口的副本: 名称 消费者数量 消息入队 消息出队 TEST_TOPIC 1 26490 0

【问题讨论】:

    标签: memory-leaks jms messaging activemq


    【解决方案1】:

    默认情况下,消息将存储在您在配置文件中配置的持久性存储中,但只要:

    • 此类消息有一个有效订阅
    • 存在对此类消息的持久订阅(消费者)。

    如果您在以与生成消息相同(或更高)的速率使用消息时遇到问题,您有多种可能性:

    • flow control
    • Pending Message Limit Strategy(它允许您配置代理在其预取缓冲区之外为消费者保留的匹配消息的最大数量。一旦达到此最大值,当新消息进入时,旧消息将被丢弃)
    • Time to live 您的消息。您基本上可以设置消息的有效时间,当它们达到有效时间时,代理将丢弃它们。

    在您的情况下,我会采用上述 3 种策略之一。我个人会选择第二个(待定消息限制策略)。

    【讨论】:

    • 我的生产者每秒发布约 10 条消息。但是生产者和activemq服务器运行在距离消费者大约3000公里的远程服务器上。即使我让 onMessage(Message msg) 方法体清空堆内存,即使速度较慢,仍在增长。
    • 我设置了待处理消息限制和预取大小。但实际上问题在于消息不是 AUTO_ACK 并且它们在消费者中增加。我必须深入研究 activemq 代码才能理解这一点。
    猜你喜欢
    • 2017-07-31
    • 1970-01-01
    • 2019-09-09
    • 2018-03-08
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多