没有订阅者时,在ActiveMQ上过期消息

时间:2013-10-02 14:03:56

标签: java jms activemq spring-integration

将消息添加到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 integration:

<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" />

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

你有

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