2013-10-02 37 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

相關問題