我们定义了一个包含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中的属性销毁/释放消费者。
其他人也遇到过类似的问题吗?您最终是如何解决这个问题的?
谢谢。
发布于 2015-01-14 18:48:42
我们使用Apache Camel进行JMS集成,它抽象了Spring (DefaultMessageListenerContainer),根据我们的经验,它工作得很好。
然而,我会像这样解决你的问题:
DMLC
CACHE_CONSUMER (documentation)。试着调优这个属性,看看是不是DMLC导致了泄漏。
$JAVA_HOME/bin/jvisual.vm附带的)这样的工具开始进行堆分析。它可以让您看到在内存中保存对象的是什么
如果你正在评估Camel,这个来自RedHat的开发人员的blog post帮助我们解决了一些事务方面的问题。如果你没有使用事务,这应该不是问题。
https://stackoverflow.com/questions/27867984
复制相似问题