最近在工作中使用到了activemq,由于消费者这边涉及大量计算,比较耗时,发送方数据也是源源不断的过来,目前的配置是有两个消费客户端在监听,为了让消息更均衡的分配到这两个消费者端,需要设置prefetchSize小点,activemq默认的是1000。
在网上看的都是按照下面的配置设置prefetchSize,我尝试过都不管用,不知道是哪个步骤设置的不对。
按照下面的配置是可以正确设置prefetchSize的,本人已实验过。
<!--author: kxl -->
<bean id="connectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory"
destroy-method="stop">
<property name="connectionFactory">
<bean class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL">
<value>${jms.mms.news.broker.url}</value>
</property>
<property name="prefetchPolicy" ref="prefetchPolicy" />
<!-- <property name="optimizeAcknowledge" value="true" /> -->
<property name="useAsyncSend" value="true" />
</bean>
</property>
<property name="maxConnections" value="100"></property>
</bean>
<bean id="prefetchPolicy" class="org.apache.activemq.ActiveMQPrefetchPolicy">
<property name="queuePrefetch" value="10" />
</bean>
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory">
<ref local="connectionFactory" />
</property>
<property name="pubSubDomain" value="false" />
</bean>
<bean id="mmsNewsDestination" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg index="0" value="mmsNewsQueue"/>
</bean>
可在activemq管理后台看配置的是否正确
点开Queue名字为mmsNewsQueue的队列,然后点击
View Consumers
这里connection ID有十个的原因是我设置了consumer端并发消费的线程数是10个。用concurrency=”10-20”表示,最大为20个。
可以看一下接收消息方的配置
<bean id="connectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory"
destroy-method="stop">
<property name="connectionFactory">
<bean class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL">
<value>${jms.mms.news.broker.url}</value>
</property>
</bean>
</property>
<property name="maxConnections" value="100"></property>
</bean>
<jms:listener-container container-type="default"
connection-factory="connectionFactory"
concurrency="10-20"
acknowledge="auto">
<jms:listener destination="mmsNewsQueue" ref="mmsNewsMessageListener"/>
</jms:listener-container>