我们定义了一个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中的属性销毁/释放使用者的任何明确方法。
还有其他人遇到过类似的问题吗?你是怎么最终解决这个问题的?
谢谢。
答案 0 :(得分:2)
我们使用Apache Camel进行JMS集成,它抽象出了Spring的DMLC(DefaultMessageListenerContainer),根据我们的经验,它可以很好地工作。
尽管如此,我会像这样攻击你的问题:
CACHE_CONSUMER
(documentation)。尝试调整此属性,看看它是否是造成泄漏的DMLC。$JAVA_HOME/bin/jvisual.vm
)。它可以让你看到在内存中保存对象的内容如果你正在评估Camel,那么来自RedHat的一位开发人员的blog post帮助我们解决了一些与交易有关的问题。如果您不使用交易,则不应该成为问题。