2013-10-02 38 views
2

当向没有订阅者的ActiveMQ代理中的队列添加消息时,队列填满并最终导致生产者线程挂起,无法发布更多消息。当没有订阅者时在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中寻找时,它无法任何更多的消息发布到代理的内存使用情况看起来很好(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" /> 

回答

3

代理确实定期扫描队列以丢弃过期的消息。问题是过期的消息发生了什么。考虑到您拥有的配置,它们可能以DLQ结束,因此您可能需要考虑配置丢弃策略,以避免将过期消息添加到DLQ。有关该问题,请参阅ActiveMQ documentation

0

你有没有

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

+0

我已将时间设置为60秒 - 请参阅上面的代码编辑。也可能值得注意的是,虽然消息正在生成成功,但JConsole队列中的ExpiredCount属性在到期时间(60s)之后会为每条消息递增, – James

相关问题