2015-01-09 25 views
0

我們定義了一個applicationContext.xml,其中包含我們的ActiveMQ偵聽器的容器。我們使用使用DefaultMessageListenerContainer如下圖所示:ActiveMQ消費者在applicationContext.xml中使用DefaultMessageListenerContainer時增長

<bean id="jmsFactory" class="org.apache.activemq.ActiveMQConnectionFactory"> 
    <property name="brokerURL" value="${smqurl}"/> 
</bean> 

<bean id="documentListener" class="org.abc.jms.SMsgListener"> 
    <property name="appProperties" ref="ApplicationProperties"/> 
</bean> 

<bean id="cachingConnectionFactory" 
    class="org.springframework.jms.connection.CachingConnectionFactory"> 
    <property name="targetConnectionFactory" ref="jmsFactory" /> 
    <property name="sessionCacheSize" value="1"/> 
    <property name="cacheConsumers" value="false"/> 
</bean> 

<bean id="container" 
    class="org.springframework.jms.listener.DefaultMessageListenerContainer"> 
    <property name="connectionFactory" ref="cachingConnectionFactory"/> 
    <property name="messageListener" ref="documentListener"/> 
    <property name="destinationName" value="SQueue" /> 
    <property name="concurrentConsumers" value="10" /> 
    <property name="maxConcurrentConsumers" value="20" /> 
</bean> 

的問題是,消費者不斷增加所有的時間和不被破壞掉了。最終,我們遇到了OutOfMemory異常。

我們嘗試查看文檔和聯機,但無法找到任何顯式方式通過applicationContext.xml中的屬性銷燬/釋放消費者。

是否有其他人遇到過類似的問題?你最終如何解決這個問題?

謝謝。

回答

2

我們使用Apache Camel作爲我們的JMS集成,它抽象了Spring的DMLC(DefaultMessageListenerContainer),在我們的經驗中它工作得很好。

不過,我會攻擊你的問題是這樣的:葉準直器的

  1. 默認的緩存級別是CACHE_CONSUMERdocumentation)。嘗試調整此屬性,看看它是否是導致泄漏的DMLC。
  2. 從像VisialVM這樣的工具開始進行堆分析(它隨JDK提供,$JAVA_HOME/bin/jvisual.vm)。它可以讓你看到什麼,從開發商一個固定物體在內存

如果你正在評估駱駝,這在blog post RedHat的幫助我們解決一些問題,我們曾與交易。如果你沒有使用交易,那應該不成問題。