现象:
生产出现队列堆积并有队列超时进入死信,Producer发送消息后,consumer在30~90秒后才收到请求开始处理。
原因:
在多个消费者消费同一个队列的情况下,mq有几率将所有消息都交给一个消费者消费。出现忙的忙死,闲的闲死的情况
解决方案:
mq默认预取消息数量=1000,限制每个消费者的预取消息数量,平均每个消费者的消费数量。
如果一个消费者预取了18条消息,那么这18条消息只能由这个消费者来消费,超时时间为90秒,一条消息的消费时间约为5秒,18*5=90秒,所以预取消息数量不能大于18条。
将mq的queuePerfetch设置为10.
<bean id="prefetchPolicy" class="org.apache.activemq.ActiveMQPrefetchPolicy">
<property name="queuePrefetch" value="10"/>
</bean>
<bean id="jmsConnectionFactory" class="bis.framework.config.MqConnectionFactory">
<property name="trustAllPackages" value="true"/>
<property name="prefetchPolicy" ref="prefetchPolicy"/>
</bean>