ActiveMQ消费者在applicationContext.xml中使用DefaultMessageListenerContainer时不断增长

时间:2015-01-09 19:41:17

标签: activemq

我们定义了一个applicationContext.xml,它包含ActiveMQ监听器的容器。我们正在使用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 Exception。

我们尝试查看文档和在线但未找到通过applicationContext.xml中的属性销毁/释放使用者的任何明确方法。

还有其他人遇到过类似的问题吗?你是怎么最终解决这个问题的?

谢谢。

1 个答案:

答案 0 :(得分:2)

我们使用Apache Camel进行JMS集成,它抽象出了Spring的DMLC(DefaultMessageListenerContainer),根据我们的经验,它可以很好地工作。

尽管如此,我会像这样攻击你的问题:

  1. DMLC的默认缓存级别为CACHE_CONSUMERdocumentation)。尝试调整此属性,看看它是否是造成泄漏的DMLC。
  2. 首先使用VisialVM等工具进行堆分析(它附带JDK,$JAVA_HOME/bin/jvisual.vm)。它可以让你看到在内存中保存对象的内容
  3. 如果你正在评估Camel,那么来自RedHat的一位开发人员的blog post帮助我们解决了一些与交易有关的问题。如果您不使用交易,则不应该成为问题。