Spring 活动MQ停止在大量消息上调度消息
我有一个基于SpringJMS和ActiveMQ(5.6)的系统构建,它有大约12个Spring默认消息侦听器容器(每个容器最多20个并发实例),所有容器都连接到同一个ActiveMQ目标(队列) 系统的工作原理是,每个处理程序(容器)使用选择器从队列中获取消息,并将其发送到自身,然后执行其工作,然后将消息放回队列,直到所有工作完成 我正在做一个基准测试,发送25000条消息,每条消息都需要经过9个不同的处理程序 每次我运行测试时,只有大约11300条消息通过我的所有处理程序,但活动MQ不会发送更多消息 在当前测试结束时,我可以看到队列的以下统计信息: 排队人数:120359 出列人数:106693 派送人数:106693 机上计数:0 队列大小:13666 除非我重新启动代理,否则活动MQ不会再发送消息 以下是我的活动mq配置:Spring 活动MQ停止在大量消息上调度消息,spring,jms,activemq,spring-jms,Spring,Jms,Activemq,Spring Jms,我有一个基于SpringJMS和ActiveMQ(5.6)的系统构建,它有大约12个Spring默认消息侦听器容器(每个容器最多20个并发实例),所有容器都连接到同一个ActiveMQ目标(队列) 系统的工作原理是,每个处理程序(容器)使用选择器从队列中获取消息,并将其发送到自身,然后执行其工作,然后将消息放回队列,直到所有工作完成 我正在做一个基准测试,发送25000条消息,每条消息都需要经过9个不同的处理程序 每次我运行测试时,只有大约11300条消息通过我的所有处理程序,但活动MQ不会发送
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:amq="http://activemq.apache.org/schema/core" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core-5.5.0.xsd">
<bean id="propertyConfigurer" class="org.springframework.web.context.support.ServletContextPropertyPlaceholderConfigurer" />
<!-- The <broker> element is used to configure the ActiveMQ broker. -->
<broker xmlns="http://activemq.apache.org/schema/core"
brokerName="jmsDeployMqBroker" dataDirectory="${java.io.tmpdir}/activemq-data"
destroyApplicationContextOnStop="true" useJmx="true">
<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntry topic=">" producerFlowControl="false">
</policyEntry>
<policyEntry queue=">" producerFlowControl="false">
</policyEntry>
</policyEntries>
</policyMap>
</destinationPolicy>
<destinations>
<queue physicalName="handlersDest"/>
<topic physicalName="notificationsDest" />
<queue physicalName="ActiveMQ.DLQ" />
</destinations>
<!-- The managementContext is used to configure how ActiveMQ is exposed
in JMX. By default, ActiveMQ uses the MBean server that is started by the
JVM. For more information, see: http://activemq.apache.org/jmx.html -->
<managementContext>
<managementContext createConnector="false" />
</managementContext>
<!-- Configure message persistence for the broker. The default persistence
mechanism is the KahaDB store (identified by the kahaDB tag). For more information,
see: http://activemq.apache.org/persistence.html -->
<persistenceAdapter>
<amq:kahaPersistenceAdapter directory="${java.io.tmpdir}/activemq-data/kahadb" maxDataFileLength="1g" />
</persistenceAdapter>
<!-- The transport connectors expose ActiveMQ over a given protocol to
clients and other brokers. For more information, see: http://activemq.apache.org/configuring-transports.html -->
<transportConnectors>
<transportConnector name="openwire" uri="${org.apache.activemq.brokerURL}" />
</transportConnectors>
</broker>
</beans>
下面是我的spring处理程序配置示例:
<jee:jndi-lookup id="connectionFactory" jndi-name="${jndi.jms.connfactory}">
<jee:environment>
java.naming.factory.initial = ${jndi.jms.naming.factory.initial}
java.naming.provider.url = ${jndi.jms.naming.url}
</jee:environment>
</jee:jndi-lookup>
<!-- ID must not change as it is used in autowiring the handlers -->
<jee:jndi-lookup id="handlersDest" jndi-name="${jndi.docprod.queue}">
<jee:environment>
java.naming.factory.initial = ${jndi.jms.naming.factory.initial}
java.naming.provider.url = ${jndi.jms.naming.url}
${jndi.queue.setup}
</jee:environment>
</jee:jndi-lookup>
<!-- ID must not change as it is used in autowiring the handlers -->
<jee:jndi-lookup id="notificationsDest" jndi-name="${jndi.docprod.topic}">
<jee:environment>
java.naming.factory.initial = ${jndi.jms.naming.factory.initial}
java.naming.provider.url = ${jndi.jms.naming.url}
${jndi.topic.setup}
</jee:environment>
</jee:jndi-lookup>
<bean id="dmsReadContainer" class="mydomain.DocProdnMessageListenerContainer"
p:connectionFactory-ref="connectionFactory"
p:handlerClass="mydomain.DmsReadHandler"
p:messageListener-ref="dmsReadHandler"
p:destination-ref="handlersDest" >
<property name="concurrentConsumers"><value>${dmsRead.initialInstances}</value></property>
<property name="maxConcurrentConsumers"><value>${dmsRead.maxInstances}</value></property>
<property name="idleConsumerLimit"><value>${dmsRead.idleInstances}</value></property>
</bean>
<bean id="dmsReadHandler" class="mydomain.DmsReadHandler">
</bean>
...
java.naming.factory.initial=${jndi.jms.naming.factory.initial}
java.naming.provider.url=${jndi.jms.naming.url}
java.naming.factory.initial=${jndi.jms.naming.factory.initial}
java.naming.provider.url=${jndi.jms.naming.url}
${jndi.queue.setup}
java.naming.factory.initial=${jndi.jms.naming.factory.initial}
java.naming.provider.url=${jndi.jms.naming.url}
${jndi.topic.setup}
${dmsRead.initialInstances}
${dmsRead.maxInstances}
${dmsRead.idleInstances}
...
ActiveMQ的日志文件并没有显示任何异常的内容,这表明了它停止调度的原因
有人知道为什么不会发送更多的消息,或者对进一步诊断问题有什么建议吗?我会尝试下面的方法来打开一点
<systemUsage>
<systemUsage>
<memoryUsage><memoryUsage limit="4 gb"/></memoryUsage> <!--75% of avail heap-->
<storeUsage><storeUsage limit="10 gb"/></storeUsage>
<tempUsage><tempUsage limit="10 gb"/></tempUsage>
</systemUsage>
</systemUsage>
这似乎是activemq中的问题 目前有一个关于它的Jira:
您是否使用您的邮件?如果不是,那是您的消息存储库(kahadb)的容量集的结果。我的消息消费者正在工作,他们正在将消息排在队列中。。。这就是你的意思吗?我查看了池连接工厂,但正如你所看到的,在我的上下文中,我慎重地没有提到任何activemq类。有没有办法使用JNDI从activeMQ获取池连接工厂?
<bean id="pooledConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory">
<property name="maxConnections" value="8" />
<property name="connectionFactory" ref="jmsConnectionFactory" />
</bean>
<persistenceAdapter>
<kahaDB directory="activemq-data" journalMaxFileLength="32mb" enableJournalDiskSyncs="false"/>
</persistenceAdapter>
tcp://localhost:61616?jms.prefetchPolicy.all=10