【问题标题】:Expire Messages on ActiveMQ when there are not subscribers没有订阅者时在 ActiveMQ 上过期消息
【发布时间】:2013-10-02 14:03:56
【问题描述】:

将消息添加到没有订阅者的 ActiveMQ 代理中的队列时,队列会填满,最终生产者线程挂起,无法发布更多消息。

为了解决这个问题,我设置了消息的过期时间,认为这会释放内存,但不幸的是这不起作用。有谁知道我该如何解决这个问题?

我的代理 ActiveMQ 版本是 5.7,代理定义是:

<bean id="mqBroker" class="org.apache.activemq.broker.BrokerService" init-method="start" destroy-method="stop">
    <property name="brokerName" value = "mainBroker"/>
    <property name="persistent" value="false"/>
    <property name="useJmx" value="false"/>
    <property name="transportConnectorURIs">
        <list>
            <value>tcp://localhost:7000</value>
        </list>
    </property>
</bean>

当 JConsole 无法向代理发布更多消息时,查看 JConsole 时,内存使用情况看起来很好(使用率为 0%)并且过期计数 = 已发布计数。

我用来发布消息的代码是 spring 集成:

<jms:outbound-channel-adapter
    channel="jsonChannel"
    connection-factory="jmsConnectionFactory"
    pub-sub-domain="false"
    destination-name="MY_QUEUE"
    time-to-live="60000"
    wxplicit-qos-enabled="true" />

【问题讨论】:

    标签: java jms activemq spring-integration


    【解决方案1】:

    代理会定期扫描队列以丢弃过期消息。问题是过期消息发生了什么。考虑到您的配置,它们可能最终会出现在 DLQ 中,因此您可能需要考虑配置丢弃策略以不将过期消息添加到 DLQ。有关问题,请参阅 ActiveMQ documentation

    【讨论】:

      【解决方案2】:

      你有没有

      • 使用message.setJMSExpiration(...); 作为您的javax.jms.Message
      • 设置“生存时间”属性(专为主题发布而设计,但在特殊情况下也可用于队列)

      【讨论】:

      • 我已将生存时间设置为 60 多岁 - 请参阅上面的代码编辑。此外,可能值得注意的是,当消息成功生成时,JConsole 中队列上的 ExpiredCount 属性在到期时间(60 秒)后为每条消息递增
      猜你喜欢
      • 2016-03-22
      • 1970-01-01
      • 2017-01-24
      • 2017-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多